Spark官方文档中提到了两种SQL语法:Spark native SQL语法和Hive QL语法。我找不到关于他们差异的详细解释。我对以下问题感到困惑:
- Spark本地SQL语法是Hive QL的子集吗?我问这个问题是因为在一些文章中他们是这样说的。根据Spark官方页面https://spark.apache.org/docs/3.0.0-preview2/sql-migration-guide.html#compatibility-with-apache-hive的解释,Spark SQL似乎不支持Hive QL的所有功能。
- 如果问题1是肯定的,为什么我可以运行"join A like "在Spark SQL,但不是在Hive?
- Spark如何将SQL语句视为Spark本地SQL或Hive QL?
- 当我们在Spark会话初始化期间使用enablehivessupport时,是否意味着Spark会将所有给定的SQL语句视为Hive QL?
序
HiveQL是SQL-92, MySQL和Oracle的SQL方言。它还提供了来自后来的SQL标准的特性,比如窗口函数。此外,HiveQL扩展了一些不属于SQL标准的特性。他们受到MapReduce的启发,例如。,多表插入。
简单地说,你可以通过类似sql的HiveQL使用MapReduce基于java的功能来分析数据,因为Apache Hive是Hadoop之上的一种数据仓库。
使用Hive时,必须实例化具有Hive支持的SparkSession,包括连接到持久的Hive metastore,支持Hive server和Hive自定义函数。
没有Hive部署的用户仍然可以启用Hive支持。Spark为您处理存储
val spark = SparkSession
.builder()
.appName("Spark Hive Example")
.config("spark.sql.warehouse.dir", warehouseLocation)
.enableHiveSupport()
.getOrCreate()
- 我想说它们是高度重叠的。Spark SQL几乎是的超集HiveQL。
Spar SQL不是HiveQL的子集;关于后一部分,这是因为在SQL:2003标准中引入了像谓词这样的正则表达式。Spark SQL是SQL:2003兼容的,HiveQL只实现了SQL:2003中引入的极少数功能,并且在少数功能中,rlike
不包括在HiveQL中。- 你必须查看Spark的源代码。实际上,在我看来,人们只需要记住Spark SQL可以帮助您从各种数据源读取和写入数据,它涵盖了HiveQL。Spark SQL被赋予HiveQL的大部分功能。
- 不完全是。Spark SQL就是Spark SQL。启用了您提到的功能后,通常意味着您将与Apache Hive进行通信。即使你没有Apache Hive实体,只要启用了该功能,你也可以通过Spark SQL使用HiveQL的一些特性由于Spark SQL支持HiveQL的大部分特性,并且Spark有一个内部机制来处理数据仓库的存储。
/* Example of Utilizing HiveQL via Spark SQL */
CREATE TABLE person (id INT, name STRING, age INT, class INT, address STRING);
INSERT INTO person VALUES
(100, 'John', 30, 1, 'Street 1'),
(200, 'Mary', NULL, 1, 'Street 2'),
(300, 'Mike', 80, 3, 'Street 3'),
(400, 'Dan', 50, 4, 'Street 4');
/* Utilize a feature from HiveQL */
SELECT * FROM person
LATERAL VIEW EXPLODE(ARRAY(30, 60)) tabelName AS c_age
LATERAL VIEW EXPLODE(ARRAY(40, 80)) AS d_age;
引用- 李建平,李建平,李建平,李建平,2014。学习火花:闪电般的数据分析。2版。Sebastopol, CA: O 'Reilly, pp 83-112.
- ISO/IEC JTC 1/SC 32数据管理与交换,1992,信息技术数据库语言SQL, ISO/IEC 9075:1992,美国
- ISO/IEC JTC 1/SC 32数据管理和交换,2003,信息技术。数据库语言。SQL。第2部分:基础(SQL/Foundation), ISO/IEC 9075-2:2003,美国
- White, T.(2015)。Hadoop:权威指南。第4版。Sebastopol, O'Reilly Media,第471-518页。
- cwiki.apache.org。2013.LanguageManual LateralView。[在线]可在:https://cwiki.apache.org/confluence/display/Hive/LanguageManual.
- spark.apache.org。2021.蜂巢表。[在线]可在:https://spark.apache.org/docs/latest/sql-data-sources-hive-tables.html.
rlike
不包括在HiveQL中。/* Example of Utilizing HiveQL via Spark SQL */
CREATE TABLE person (id INT, name STRING, age INT, class INT, address STRING);
INSERT INTO person VALUES
(100, 'John', 30, 1, 'Street 1'),
(200, 'Mary', NULL, 1, 'Street 2'),
(300, 'Mike', 80, 3, 'Street 3'),
(400, 'Dan', 50, 4, 'Street 4');
/* Utilize a feature from HiveQL */
SELECT * FROM person
LATERAL VIEW EXPLODE(ARRAY(30, 60)) tabelName AS c_age
LATERAL VIEW EXPLODE(ARRAY(40, 80)) AS d_age;
Spark文档列出了已知的不兼容性
我还发现了由于spark解析器中的错误而导致的一些不兼容性。看起来hive更健壮。
您可能还会发现spark序列化/反序列化实现的差异,如本答案所述。基本上你必须调整这些属性:
spark.sql.hive.convertMetastoreOrc=false
spark.sql.hive.convertMetastoreParquet=false
,但要注意,它将有性能损失。