>我正在从Hive表中获取一些数据并插入到数据帧上:
df = sqlContext.table('mydb.mytable')
我正在过滤一些无用的值:
df = df[df.myfield != "BADVALUE"]
我想在数据帧上执行此操作,而不是出于代码设计原因作为select
查询。我注意到,即使在我过滤了数据帧之后,似乎每次我稍后对 df 进行操作时,都会完成来自 Hive 的查询和加载操作:
df.groupBy('myfield').mean()
这将花费很长时间,与我没有过滤数据框完全相同。有没有办法对它的深层副本进行提高性能并减少内存占用?
听起来你需要缓存你的数据帧
df.cache()
Spark 被懒惰地评估。当您执行转换(例如筛选器)时,Spark实际上不会执行任何操作。在执行操作(例如显示、计数等)之前,不会进行计算。Spark不会保留任何中间(最终)结果。它仅保留创建所有数据帧所需的步骤。为了避免多个冗余步骤(例如,在表中读取,过滤掉错误值),如果执行多个操作,则需要将中间数据帧缓存到内存中。