我是 Spark SQL 世界的新手。我目前正在迁移应用程序的摄取代码,其中包括在 HDFS 中的阶段、原始层和应用程序层摄取数据以及进行 CDC(更改数据捕获),这当前是在 Hive 查询中编写的,并通过 Oozie 执行。这需要迁移到 Spark 应用程序(当前版本 1.6)。代码的其他部分将在稍后迁移。
在 Spark-SQL 中,我可以直接从 Hive 中的表创建数据帧,并按原样执行查询(如
sqlContext.sql("my hive hql")
)。另一种方法是使用 dataframe API 并以这种方式重写 hql。
这两种方法有什么区别?
使用 Dataframe API 是否有任何性能提升?
有人提出,直接使用“SQL”查询时,Spark核心引擎必须经过一层额外的SQL,这可能会在一定程度上影响性能,但我没有找到任何材料证实这一说法。我知道使用 Datafrmae API 代码会更加紧凑,但是当我的 hql 查询都方便时,是否真的值得将完整的代码写入 Dataframe API 中?
谢谢你。
问题:这两种方法有什么区别? 使用 Dataframe API 是否有任何性能提升?
答案:
霍顿作品做了比较研究。 来源...
要点基于每种情况/场景都是正确的。没有 决定这一点的硬性规定。请阅读下面..
Spark 的核心是基于弹性分布式数据集(RDD)的概念:
DataFrames API 是一个数据抽象框架,可将数据组织到命名列中:
SparkSQL是用于结构化数据处理的Spark模块。您可以通过以下方式与 SparkSQL 交互:
DataFrames 和 SparkSQL 的表现几乎相同,尽管在涉及聚合和排序的分析中 SparkSQL 稍有优势
从语法上来说,DataFrames 和 SparkSQL 比使用 RDD 更直观
每次测试均取 3 项中最好的一项
时间一致,测试之间没有太大差异
作业单独运行,没有其他作业运行
从 900 万个唯一订单 ID 中随机查找 1 个订单 ID 对所有不同的产品及其总计数进行分组,并按产品名称降序排序
在 Spark SQL 字符串查询中,直到运行时您才会知道语法错误(这可能成本高昂),而在 DataFrames 中语法错误可以在编译时捕获。
还有更多补充。 Dataframe 使用 tungsten 内存表示,sql 和 dataframe 使用的催化剂优化器。与 SparkSQL 相比,使用 Dataset API,您可以更好地控制实际执行计划
如果查询很长,那么高效编写和运行查询是不可能的。 另一方面,DataFrame 与 Column API 一起帮助开发人员编写紧凑的代码,这对于 ETL 应用程序来说是理想的选择。
此外,所有操作(例如大于、小于、选择、其中等)....使用“DataFrame”运行构建一个“抽象语法树(AST)”,然后将其传递给“Catalyst”进一步优化。 (来源:Spark SQL 白皮书,第 3.3 节)