Spark SQL本机语法和Spark中的Hive QL语法有什么区别?

3npbholx  于 2022-09-27  发布在  Spark
关注(0)|答案(2)|浏览(286)

在Spark官方文档中,提到了两种类型的SQL语法:Spark原生SQL语法和Hive QL语法。我找不到关于他们差异的详细解释。我对以下问题感到困惑:
1.Spark原生SQL语法是Hive QL的子集吗?我之所以这样问,是因为在一些文章中他们这样说。根据Spark官方页面上的解释https://spark.apache.org/docs/3.0.0-preview2/sql-migration-guide.html#compatibility-对于apache hive,Spark SQL似乎并不支持hive QL的所有功能。
1.如果问题1是肯定的,为什么我可以在Spark SQL中运行“join A rlike B”,但不能在Hive中运行?
1.Spark如何将SQL语句视为Spark原生SQL或Hive QL?
1.当我们在初始化Spark会话时使用enableHiveSupport时,这是否意味着Spark会将所有给定的SQL语句视为Hive QL?

wqlqzqxt

wqlqzqxt1#

序言

HiveQL混合了SQL-92、MySQL和Oracle的SQL方言。它还提供了较新SQL标准的功能,如窗口函数。此外,HiveQL扩展了一些不属于SQL标准的特性。它们的灵感来源于MapReduce,例如多表插入。

简言之,您可以通过类似SQL的HiveQL使用MapReduce基于Java的功能分析数据,因为Apache Hive是一种基于Hadoop的数据仓库。
使用Spark SQL,您可以以各种结构化格式读取和写入数据,Hive表就是其中之一。Spark SQL支持ANSI SQL:2003兼容命令和HiveQL。简而言之,您可以使用Spark引擎的强大功能通过类似于Spark SQL的SQL操作数据,Spark SQL涵盖了HiveQL的大部分功能。
使用配置单元时,必须示例化支持配置单元的SparkSession,包括连接到持久配置单元元存储、支持配置单元serdes和配置单元用户定义函数。
没有现有配置单元部署的用户仍然可以启用配置单元支持。Spark为您处理存储。

val spark = SparkSession
  .builder()
  .appName("Spark Hive Example")
  .config("spark.sql.warehouse.dir", warehouseLocation)
  .enableHiveSupport()
  .getOrCreate()

答案

1.我认为它们高度重叠。Spark SQL几乎是HiveQL的超集
1.Spar SQL不是HiveQL的子集;关于后一部分,这是因为SQL:2003标准中引入了类似 predicate 的正则表达式。Spark SQL与SQL:2003兼容,HiveQL只实现了SQL:2003中引入的少数功能,在少数功能中,rlike未包含在HiveSQL中。
1.你必须查看Spark的source code。实际上,在我看来,只要记住Spark SQL就可以帮助您从各种数据源读取和写入数据,它涵盖了HiveQL。Spark SQL拥有HiveQL的大部分功能。
1.不完全是。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;

参考文献

1.Damji,J.、Wenig,B.、Das,T.和Lee,D.,2020年。学习Spark: lightning 快速数据分析。第二版,加利福尼亚州塞巴斯托Perl:O'Reilly,第83-112页。
1.ISO/IEC JTC 1/SC 32数据管理和交换,1992,信息技术-数据库语言-SQL,ISO/IEC 9075:1992,美国。
1.ISO/IEC JTC 1/SC 32数据管理和交换,2003,信息技术-数据库语言-SQL-第2部分:基础(SQL/Foundation),ISO/IEC 9075-2:2003,美国。
1.White,T.(2015)Hadoop:最终指南。第4版。塞巴斯托Perl,奥赖利媒体,第471-518页。
1.cwiki.apache.org。2013.语言手册横向视图。[在线]网址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual
1.spark.apache.org。2021。Hive表。[在线]网址:https://spark.apache.org/docs/latest/sql-data-sources-hive-tables.html

dsekswqp

dsekswqp2#

Spark文档lists the known incompatibilities
我还发现了由于spark解析器中的bug而导致的一些不兼容性。Hive看起来更结实了。
您还可能会发现spark序列化/反序列化实现中的差异,即explained in this answer。基本上,您必须调整这些属性:

spark.sql.hive.convertMetastoreOrc=false
spark.sql.hive.convertMetastoreParquet=false

但请注意,它将受到性能惩罚。

相关问题