【发布时间】:2016-05-15 08:02:37
【问题描述】:
使用 Spark 实现良好的性能。我想知道通过SQLContext 使用sql 查询是否更好,或者通过df.select() 等DataFrame 函数进行查询是否更好。
有什么想法吗? :)
【问题讨论】:
标签: sql performance apache-spark dataframe apache-spark-sql
使用 Spark 实现良好的性能。我想知道通过SQLContext 使用sql 查询是否更好,或者通过df.select() 等DataFrame 函数进行查询是否更好。
有什么想法吗? :)
【问题讨论】:
标签: sql performance apache-spark dataframe apache-spark-sql
没有任何性能差异。两种方法都使用完全相同的执行引擎和内部数据结构。归根结底,一切都归结为个人喜好。
可以说DataFrame 查询更容易以编程方式构造并提供最小的类型安全性。
简单的 SQL 查询可以更加简洁和易于理解。它们也是可移植的,无需对每种支持的语言进行任何修改即可使用。使用HiveContext,这些也可用于公开一些其他方式无法访问的功能(例如没有 Spark 包装器的 UDF)。
【讨论】:
理想情况下,Spark 的催化剂应该优化对同一执行计划的两次调用,并且性能应该相同。如何打电话只是你的风格问题。 实际上,Hortonworks (https://community.hortonworks.com/articles/42027/rdd-vs-dataframe-vs-sparksql.html) 的报告有所不同,在这种情况下,当您需要 GROUPed 记录且其总 COUNTS 按记录名称排序时,SQL 优于 Dataframes。
【讨论】:
通过使用 DataFrame,可以将 SQL 分解为多个语句/查询,这有助于调试、轻松增强和代码维护。
将复杂的 SQL 查询分解为更简单的查询并将结果分配给 DF 可以更好地理解。
通过将查询拆分为多个 DF,开发人员获得了使用缓存、修复(使用唯一/接近唯一键在分区之间均匀分布数据)的优势。
【讨论】:
唯一重要的是使用什么样的底层算法进行分组。 HashAggregation 会比 SortAggregation 更有效。 SortAggregation - 将对行进行排序,然后将匹配的行聚集在一起。 O(n*log n) HashAggregation 使用键作为分组列创建 HashMap,其余列作为 Map 中的值。 Spark SQL 尽可能使用 HashAggregation(如果值的数据是可变的)。 O(n)
【讨论】: