2015-10-30 129 views
0

我使用Apache的火花在斯卡拉在数据帧上运行多个列聚合例如阿帕奇星火多个聚合

select column1, sum(1) as count from df group by column1 
select column2, sum(1) as count from df group by column2 

实际的聚合不仅仅是总和(1)更复杂,但它除了点。 查询字符串如上述示例被编译为每个我想聚集,我通过火花SQL上下文执行每个字符串创建表示所讨论

我的问题的性质的聚合的相应数据帧的可变是我必须为数千个变量执行此操作。

我的理解是Spark每次执行聚合时都必须“读”主数据框。

有没有其他方法可以更有效地做到这一点?

感谢您阅读我的问题,并提前感谢您的帮助。

+1

您是否考虑缓存? – eliasah

回答

2

继续并使用源数据构建DataFrame后,缓存数据帧。另外,为避免在代码中编写所有查询,请继续将它们放入文件并在运行时传递该文件。在你的代码中可以读取你的文件,然后你可以运行你的查询。这种方法最好的部分是你可以通过更新文件而不是应用程序来改变你的查询。只要确保你找到一种方法来给出独特的名字。

在PySpark中,它看起来像这样。

dataframe = sqlContext.read.parquet("/path/to/file.parquet") 
// do your manipulations/filters 
dataframe.cache() 
queries = //how ever you want to read/parse the query file 

for query in queries: 

    output = dataframe.sql(query) 
    output.write.parquet("/path/to/output.parquet") 
相关问题