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 Scala SQL 查询中包含 0 值?