我目前正在运行一些Spark代码,我需要查询每个查询花费很长时间(超过1小时)的数据框。我需要多次查询以检查数据帧是否确实正确。
我对Spark相对较新,我理解Spark使用延迟评估,这意味着只有在我调用某些操作时才执行命令(在我的情况下 .show())。
有没有办法为整个DF执行一次此过程,然后快速调用数据?
目前我将DF保存为临时表,然后以直线(HIVE)运行查询。这似乎有点矫枉过正,因为我必须首先将表保存在数据库中,这似乎是浪费时间。
我查看了以下函数.persist
,.collect
,但我对如何使用它们并从中查询感到困惑。
我真的想学习正确的方法。
非常感谢您的帮助!!
答案 0 :(得分:0)
是的,您可以使用rddName.cache()
(或persists()
)将 RDD保留在内存中。可以找到有关 RDD持久性的更多信息here
答案 1 :(得分:0)
使用临时表(registerTempTable(spark 1.6)或createOrReplaceTempView(spark2.x))不会"保存"任何数据。它只会创建一个具有生命周期的视图。如果你想保存表格,你应该使用.saveAsTable
,但我认为这不是你想要的。
使用.cache
相当于.persist(StorageLevel.MEMORY)
。如果您的桌子很大,因此无法放入内存,则应使用.persist(StorageLevel.MEMORY_AND_DISK)
。
您也可以简单地在群集中需要更多节点。如果您在本地运行,请确保使用--master local[*]
进行部署以使用计算机上的所有可用内核。如果您在独立群集或Yarn或Mesos等集群管理器上运行,则应确保为您的作业分配所有必需/可用资源。