Spark sql 查询与数据框函数

Posted

技术标签:

【中文标题】Spark sql 查询与数据框函数【英文标题】:Spark sql queries vs dataframe functions 【发布时间】:2016-02-05 11:03:52 【问题描述】:

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

有什么想法吗? :)

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

如果问题是关于 SQL order by 与 Spark orderBy 方法的问题,你的回答是否相同?谢谢。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

当我们有 spark sql 查询时,我们可以在中间级别缓存数据吗?因为在使用数据框 API 时,我们可以通过将查询拆分为多个部分来轻松实现。【参考方案4】:

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

【讨论】:

当我们有 spark sql 查询时,我们可以在中间级别缓存数据吗?因为在使用数据框 API 时,我们可以通过将查询拆分为多个部分来轻松做到这一点。

以上是关于Spark sql 查询与数据框函数的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用另一个数据框列来查询 spark sql

如何在 Spark Scala SQL 查询中包含 0 值?

一文了解函数式查询优化器Spark SQL Catalyst

用于聚合的 Spark 数据集或数据框

spark SQL 中的迄今为止的字符串(不是数据框)

执行多个火花查询并存储为数据框