使用从Hive导入的Spark数据帧,有时我会得到几个我不需要的列。假设我不想用
过滤它们df = SqlContext.sql('select cols from mytable')
我正在用
导入整个表格df = SqlContext.table(mytable)
select
和后续cache
可以提高性能/减少内存使用量,例如
df = df.select('col_1', 'col_2', 'col_3')
df.cache()
df.count()
还是浪费时间?我会在df
上执行大量操作和数据操作,例如avg
,withColumn
等。
答案 0 :(得分:1)
IMO事先过滤它们是有道理的:
df = SqlContext.sql('select col_1, col_2, col_3 from mytable')
所以你不会浪费资源......
如果你不能这样做,那么就可以像你那样做了......
答案 1 :(得分:0)
这当然是一种很好的做法,但除非您尝试通过Python RDD传递数据或执行类似操作,否则不太可能导致性能提升。如果不需要某些列来计算输出,则优化器应自动推断预测并在执行计划中尽早推送它们。
同样值得注意的是,在df.count()
之后使用df.cache()
在大多数情况下(如果不是总是)将毫无用处。通常,优化程序将count
重写为
SELECT SUM(1) FROM table
所以来源通常要求的是:
SELECT 1 FROM table
长话短说,在这里缓存没什么用。