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

时间:2017-08-01 06:49:52

标签: apache-spark hive apache-spark-sql hdfs

我是Spark SQL世界的新宠。我目前正在迁移我的应用程序的摄取代码,其中包括在HDFS中的阶段,Raw和Application层中摄取数据以及执行CDC(更改数据捕获),这当前是在Hive查询中编写的并且是通过Oozie执行的。这需要迁移到Spark应用程序(当前版本1.6)。代码的另一部分稍后将迁移。

在spark-SQL中,我可以直接从Hive中的表创建数据帧,只需按原样执行查询(如sqlContext.sql("my hive hql"))。另一种方法是使用数据帧API并以这种方式重写hql。

这两种方法有什么不同?

使用Dataframe API是否有任何性能提升?

有人建议,在使用" SQL"时,还有一层额外的SQL可以激发核心引擎。直接查询可能会在一定程度上影响绩效,但我没有找到任何证实该陈述的材料。我知道使用Datafrmae API的代码会更加紧凑,但是当我的hql查询非常方便时,将完整的代码编写到Dataframe API中真的值得吗?

谢谢。

4 个答案:

答案 0 :(得分:9)

在Spark SQL字符串查询中,在运行时之前您不会知道语法错误(这可能代价很高),而在DataFrames中,语法错误可以在编译时捕获。

答案 1 :(得分:8)

  

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

答案:

由霍顿作品进行比较研究。 source ...

  

Gist基于每个人都是对的情况/场景。没有   决定这一点的硬性规则。请通过以下内容..

RDD,DataFrames和SparkSQL(实际上3个方法不仅仅是2个):

Spark的核心是Resilient Distributed Datasets或RDD的概念:

  • 弹性 - 如果内存中的数据丢失,则可以重新创建
  • 分布式 - 在集群中许多数据节点分区的内存中的不可变分布式对象集合
  • 数据集 - 初始数据可来自文件,可通过编程方式,内存中的数据或其他RDD创建

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

  • 为数据创建架构
  • 概念上等同于关系数据库中的表
  • 可以从许多来源构建,包括结构化数据文件,Hive中的表,外部数据库或现有RDD
  • 提供数据的关系视图,以方便SQL,如数据操作和聚合
  • 引擎盖下,它是一排RDD的

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

  • SQL
  • DataFrames API
  • 数据集API

测试结果:

  • RDD在某些类型的数据处理方面优于DataFrames和SparkSQL
  • DataFrames和SparkSQL几乎完全相同,尽管分析涉及聚合和排序SparkSQL有一点点优势

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

  • 每次测试中最好的3个

  • 时间一致且测试之间差异不大

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

从9百万个唯一订单ID中随机查找1个订单ID 按产品名称

分组所有不同产品的总COUNTS和SORT DESCENDING

enter image description here

答案 2 :(得分:1)

再添加几个。数据帧使用钨内存表示,sql 使用的催化剂优化器以及数据帧。与 SparkSQL 相比,使用 Dataset API 可以更好地控制实际执行计划

答案 3 :(得分:0)

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

此外,所有操作(例如,大于,小于,选择,等等)。...使用“ DataFrame”运行会生成“ 抽象语法树(AST)”,即然后传递给“催化剂”进行进一步的优化。 (来源:Spark SQL白皮书,第3.3节