Spark sql 查询与数据框函数

Spark sql queries vs dataframe functions

使用 Spark 表现良好。我想知道通过 SQLContext 使用 sql 查询是否好,或者通过 df.select().

等 DataFrame 函数进行查询是否更好

有什么想法吗? :)

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

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

  • Plain SQL 查询可以更加简洁和易于理解。它们也是可移植的,无需任何修改即可用于每种支持的语言。使用 HiveContext,这些也可用于公开一些无法通过其他方式访问的功能(例如没有 Spark 包装器的 UDF)。

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

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

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

通过将查询拆分为多个 DF,开发人员获得了使用缓存、修复(使用 unique/close-to-unique 键在分区之间均匀分布数据)的优势。

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