在 Spark SQL 中编写 SQL 与使用 Dataframe API

问题描述 投票:0回答:4

我是 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 中?

谢谢你。

apache-spark pyspark apache-spark-sql hive hdfs
4个回答
32
投票

问题:这两种方法有什么区别? 使用 Dataframe API 是否有任何性能提升?


答案:

霍顿作品做了比较研究。 来源...

要点基于每种情况/场景都是正确的。没有 决定这一点的硬性规定。请阅读下面..

RDD、DataFrame 和 SparkSQL(实际上是 3 种方法,而不仅仅是 2 种):

Spark 的核心是基于弹性分布式数据集(RDD)的概念:

  • 弹性 - 如果内存中的数据丢失,可以重新创建
  • 分布式 - 内存中不可变的分布式对象集合,跨集群中的许多数据节点进行分区
  • 数据集 - 初始数据可以来自文件、以编程方式创建、从内存中的数据或另一个 RDD

DataFrames API 是一个数据抽象框架,可将数据组织到命名列中:

  • 为数据创建架构
  • 概念上相当于关系数据库中的表
  • 可以从许多来源构建,包括结构化数据文件、Hive 中的表、外部数据库或现有 RDD
  • 提供数据的关系视图,以实现简单的 SQL(如数据操作和聚合)
  • 在底层,它是 Row 的 RDD

SparkSQL是用于结构化数据处理的Spark模块。您可以通过以下方式与 SparkSQL 交互:

  • SQL
  • 数据帧 API
  • 数据集API

测试结果:

  • 对于某些类型的数据处理,RDD 的性能优于 DataFrames 和 SparkSQL
  • DataFrames 和 SparkSQL 的表现几乎相同,尽管在涉及聚合和排序的分析中 SparkSQL 稍有优势

  • 从语法上来说,DataFrames 和 SparkSQL 比使用 RDD 更直观

  • 每次测试均取 3 项中最好的一项

  • 时间一致,测试之间没有太大差异

  • 作业单独运行,没有其他作业运行

从 900 万个唯一订单 ID 中随机查找 1 个订单 ID 对所有不同的产品及其总计数进行分组,并按产品名称降序排序

enter image description here


27
投票

在 Spark SQL 字符串查询中,直到运行时您才会知道语法错误(这可能成本高昂),而在 DataFrames 中语法错误可以在编译时捕获。


3
投票

还有更多补充。 Dataframe 使用 tungsten 内存表示,sql 和 dataframe 使用的催化剂优化器。与 SparkSQL 相比,使用 Dataset API,您可以更好地控制实际执行计划


2
投票

如果查询很长,那么高效编写和运行查询是不可能的。 另一方面,DataFrame 与 Column API 一起帮助开发人员编写紧凑的代码,这对于 ETL 应用程序来说是理想的选择。

此外,所有操作(例如大于、小于、选择、其中等)....使用“DataFrame”运行构建一个“抽象语法树(AST)”,然后将其传递给“Catalyst”进一步优化。 (来源:Spark SQL 白皮书,第 3.3 节

© www.soinside.com 2019 - 2024. All rights reserved.