从Hive查询中深度复制已过滤的PySpark数据框

Iva*_*van 4 python apache-spark pyspark

我从Hive表中获取一些数据并插入到数据框上:

df = sqlContext.table('mydb.mytable')
Run Code Online (Sandbox Code Playgroud)

我正在过滤一些没有用的值:

df = df[df.myfield != "BADVALUE"]
Run Code Online (Sandbox Code Playgroud)

我想在数据框架上执行此操作,而不是select出于代码设计原因而作为查询。我注意到,即使在过滤数据帧之后,似乎每次以后对df进行操作时,Hive的查询和加载操作都会完成:

df.groupBy('myfield').mean()
Run Code Online (Sandbox Code Playgroud)

这将花费很长时间,就像我没有过滤数据帧一样。有没有办法对其进行深层复制以提高性能并减少内存占用量?

Dav*_*vid 5

听起来您需要缓存数据帧

df.cache()
Run Code Online (Sandbox Code Playgroud)

懒惰评估Spark。当您执行转换(例如过滤器)时,spark实际上不会做任何事情。除非您执行某项操作(例如显示,计数等),否则不会进行计算。并且Spark将不保留任何中间(最终)结果。它仅保留创建所有数据框所需的步骤。如果执行多个操作,为避免多个冗余步骤(例如,读入表,滤除不良值),则需要将中间数据帧缓存到内存中。