我是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中真的值得吗?
谢谢。
答案 0 :(得分:9)
在Spark SQL字符串查询中,在运行时之前您不会知道语法错误(这可能代价很高),而在DataFrames中,语法错误可以在编译时捕获。
答案 1 :(得分:8)
问题:这两种方法有什么不同? 使用Dataframe API是否有任何性能提升?
答案:
由霍顿作品进行比较研究。 source ...
Gist基于每个人都是对的情况/场景。没有 决定这一点的硬性规则。请通过以下内容..
Spark的核心是Resilient Distributed Datasets或RDD的概念:
DataFrames API是一个数据抽象框架,可将您的数据组织到命名列中:
SparkSQL是用于结构化数据处理的Spark模块。您可以通过以下方式与SparkSQL进行交互:
DataFrames和SparkSQL几乎完全相同,尽管分析涉及聚合和排序SparkSQL有一点点优势
从语法上讲,DataFrames和SparkSQL比使用RDD更直观
每次测试中最好的3个
时间一致且测试之间差异不大
单独运行作业,没有其他作业正在运行
从9百万个唯一订单ID中随机查找1个订单ID 按产品名称
分组所有不同产品的总COUNTS和SORT DESCENDING答案 2 :(得分:1)
再添加几个。数据帧使用钨内存表示,sql 使用的催化剂优化器以及数据帧。与 SparkSQL 相比,使用 Dataset API 可以更好地控制实际执行计划
答案 3 :(得分:0)
如果查询很长,那么将不可能进行高效的编写和运行查询。 另一方面,DataFrame与Column API一起可以帮助开发人员编写紧凑的代码,这对于ETL应用程序来说是理想的选择。
此外,所有操作(例如,大于,小于,选择,等等)。...使用“ DataFrame”运行会生成“ 抽象语法树(AST)”,即然后传递给“催化剂”进行进一步的优化。 (来源:Spark SQL白皮书,第3.3节)