[英]what's the difference between Spark SQL native syntax and Hive QL syntax in Spark?
在Spark官方文檔中,提到了兩種SQL語法:Spark原生SQL語法和Hive QL語法。 我找不到關於它們區別的詳細解釋。 我對以下問題感到困惑:
HiveQL是 SQL-92、MySQL 和 Oracle 的 SQL 方言的混合體。 它還提供來自后來的 SQL 標准的功能,例如 window 功能。 此外,HiveQL 擴展了一些不屬於 SQL 標准的功能。 它們的靈感來自 MapReduce,例如,多表插入。
簡而言之,由於 Apache Hive 是一種基於 Hadoop 的數據倉庫,因此您可以通過類似 SQL 的 HiveQL 使用 MapReduce 的基於 Java 的強大功能來分析數據。
使用Spark SQL ,您可以讀寫各種結構化格式的數據,其中之一是 Hive 表。 Spark SQL 支持符合 ANSI SQL:2003 的命令和 HiveQL。 簡而言之,您可以通過類似 SQL 的 Spark SQL 和 Spark SQL 涵蓋 HiveQL 的大部分功能,利用 Spark 引擎的強大功能來操作數據。
使用 Hive 時,必須使用 882086660602288 支持實例化 SparkSession,包括連接到持久性 Hive 元存儲、支持 Hive serdes 和 Hive 用戶定義函數。
沒有現有 Hive 部署的用戶仍然可以啟用 882086660602288 支持。 Spark 為您處理存儲。
val spark = SparkSession
.builder()
.appName("Spark Hive Example")
.config("spark.sql.warehouse.dir", warehouseLocation)
.enableHiveSupport()
.getOrCreate()
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
但要注意它會降低性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.