与从Hive导入的Spark DataFrames一起工作,有时我会得到几列,我不需要。假设我不想用
过滤它们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
等。
imo事先过滤它们是有意义的:
df = SqlContext.sql('select col_1, col_2, col_3 from mytable')
这样您就不会浪费资源...
如果您不能这样做,那么您可以像这样做...
这肯定是一个好练习,但是除非您尝试通过Python RDD或做类似的操作,否则不太可能导致性能提升。如果不需要某些列来计算输出优化器,则应自动推断投影并在执行计划中尽早推动这些投影。
还值得注意的是,在大多数情况下,在df.cache()
之后使用df.count()
将是无用的(如果不是总是)。通常,count
由优化器重写为
SELECT SUM(1) FROM table
因此,源通常要求的是:
SELECT 1 FROM table
长话短说