编写sql与在spark sql中使用dataframe API

vuv7lop3  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(265)

我是世界上的一只新蜜蜂。我目前正在迁移我的应用程序的摄取代码,包括在hdfs的stage、raw和应用层摄取数据,并执行cdc(changedatacapture),这是当前在hive查询中编写的,通过oozie执行的。这需要迁移到spark应用程序(当前版本1.6)。代码的另一部分稍后将迁移。
在sparksql中,我可以直接从配置单元中的表创建dataframes,并按原样执行查询(如 sqlContext.sql("my hive hql") ). 另一种方法是使用dataframeapi并以这种方式重写hql。
这两种方法有什么区别?
使用DataFrameAPI有什么性能提升吗?
有人建议,在直接使用“sql”查询时,spark core engine必须经历一个额外的sql层,这可能会在一定程度上影响性能,但我没有找到任何材料来证实这一说法。我知道用datafrmaeapi编写的代码要紧凑得多,但是当我把hql查询都准备好的时候,把完整的代码写进dataframeapi真的值得吗?
谢谢您。

zysjyyx4

zysjyyx41#

问:这两种方法有什么区别?使用DataFrameAPI有什么性能提升吗?
回答:
霍顿著作进行了比较研究。来源。。。
要点是基于情况/场景的,每个都是正确的。没有硬性规定来决定这件事。请看下面。。

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

spark的核心理念是弹性分布式数据集(rdd):
弹性—如果内存中的数据丢失,可以重新创建
分布式—内存中对象的不可变分布式集合,跨集群中的多个数据节点进行分区
数据集-初始数据可以来自文件、以编程方式创建、来自内存中的数据或来自另一个rdd
dataframes api是一个数据抽象框架,它将数据组织到命名列中:
为数据创建架构
在概念上等同于关系数据库中的表
可以从许多源构建,包括结构化数据文件、配置单元中的表、外部数据库或现有RDD
提供数据的关系视图,以便于进行类似sql的数据操作和聚合
引擎盖下是世界其他地区的rdd
sparksql是一个用于结构化数据处理的spark模块。您可以通过以下方式与sparksql交互:
sql语句
Dataframeapi
数据集api

测试结果:

rdd在某些类型的数据处理方面优于dataframes和sparksql
dataframes和sparksql的性能几乎相同,不过在包含聚合和排序的分析中,sparksql有一点优势
从语法上讲,dataframes和sparksql比使用rdd更直观
每次考试三分之一的成绩最好
时间是一致的,测试之间没有太大的变化
作业单独运行,没有其他作业运行
随机查找900万个唯一订单id中的一个订单id,将所有不同的产品按其总数量分组,并按产品名称降序排列

t3psigkw

t3psigkw2#

在sparksql字符串查询中,只有在运行时才知道语法错误(这可能代价高昂),而在dataframes中,语法错误可以在编译时捕获。

2guxujil

2guxujil3#

如果查询很长,则不可能高效地编写和运行查询。另一方面,dataframe和columnapi帮助开发人员编写紧凑的代码,这是etl应用程序的理想选择。
此外,所有操作(例如,大于、小于、选择、where等)。。。。使用“dataframe”运行构建“抽象语法树(abstract syntax tree,ast)”,然后将其传递给“catalyst”进行进一步优化(来源:spark sql白皮书,第3.3节)

相关问题