我目前正在运行一些Spark代码,我需要查询一个Dataframe,这是需要很长时间(超过1小时)每查询。我需要多次查询以检查Dataframe是否正确。
我对spark比较陌生,我知道spark使用延迟求值,这意味着命令只在我调用某个操作时执行(在我的例子中是.show())。
有没有一种方法可以对整个df执行一次此过程,然后快速调用数据?
目前,我将df保存为一个临时表,然后在beeline(hive)中运行查询。这似乎有点过分,因为我必须先将表保存在数据库中,这似乎是浪费时间。
我研究了以下函数 .persist
, .collect
但是我对如何使用它们和如何向它们查询感到困惑。
我真的很想学习正确的方法。
非常感谢您的帮助!!
2条答案
按热度按时间368yc8dk1#
使用临时表(registertemptable(spark 1.6)或createorreplacetempview(spark2.x))不会“保存”任何数据。它只会创建一个使用spark会话的生命周期的视图。如果要保存表,应使用
.saveAsTable
,但我想这不是你要找的。使用
.cache
相当于.persist(StorageLevel.MEMORY)
. 如果您的表太大,因此无法放入内存,则应使用.persist(StorageLevel.MEMORY_AND_DISK)
.也有可能在集群中需要更多的节点。如果您在本地运行,请确保使用
--master local[*]
使用计算机上所有可用的内核。如果您运行在独立的集群上,或者使用像yarn或mesos这样的集群管理器,您应该确保所有必要的/可用的资源都分配给了您的作业。xwmevbvl2#
是的,您可以使用
rddName.cache()
(或persists()
) . 关于rdd持久性的更多信息可以在这里找到