Spark sql查询与数据帧功能

时间:2016-02-05 11:03:52

标签: sql performance apache-spark dataframe apache-spark-sql

使用Spark表现出良好的性能。我想知道通过SQLContext使用sql查询是否合适,或者通过df.select()之类的DataFrame函数进行查询更好。

有什么想法吗? :)

4 个答案:

答案 0 :(得分:21)

没有任何性能差异。两种方法都使用完全相同的执行引擎和内部数据结构。在一天结束时,所有归结为个人喜好。

  • 可以说,DataFrame查询更容易以编程方式构建并提供最小类型安全性。

  • 纯SQL查询可以更简洁,更容易理解。还有便携式,可以使用所有支持的语言而无需任何修改。使用HiveContext时,这些也可用于公开某些功能,这些功能在其他方面是不可访问的(例如,没有Spark包装器的UDF)。

答案 1 :(得分:4)

理想情况下,Spark的催化剂应该优化对同一执行计划的两次调用,并且性能应该相同。如何打电话只是你的风格问题。 实际上,Hortonworks(https://community.hortonworks.com/articles/42027/rdd-vs-dataframe-vs-sparksql.html)的报告存在差异,当您需要GROUPED记录及其记录名称为SORT DESCENDING的总计数时,SQL的性能优于Dataframe。

答案 2 :(得分:4)

通过使用DataFrame,可以将SQL分解为多个语句/查询,这有助于调试,轻松增强和代码维护。

将复杂的SQL查询分解为更简单的查询并将结果分配给DF可以更好地理解。

通过将查询拆分为多个DF,开发人员可以获得使用缓存,修复的优势(使用唯一/接近唯一键在分区中均匀分布数据)。

答案 3 :(得分:0)

唯一重要的是使用哪种底层算法进行分组。 HashAggregation将比SortAggregation更有效。 SortAggregation-将对行进行排序,然后将匹配的行收集在一起。 O(n * log n) HashAggregation使用键作为分组列来创建HashMap,其余列则作为Map中的值。 Spark SQL在可能的情况下使用HashAggregation(如果值数据是可变的)。 O(n)