簡體   English   中英

Spark SQL 本機語法和 Spark 中的 Hive QL 語法有什么區別?

[英]what's the difference between Spark SQL native syntax and Hive QL syntax in Spark?

在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-with-apache-hive中的解釋,似乎 Spark SQL 確實不支持 Hive QL 的所有功能。
  2. 如果問題 1 是,為什么我可以在 Spark SQL 中運行“join A rlike B”,但不能在 Hive 中運行?
  3. Spark 如何將 SQL 語句視為 Spark 本機 SQL 或 Hive QL?
  4. 當我們在 Spark Session 初始化期間使用 enableHiveSupport 時,是否意味着 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()

答案

  1. 我會說它們高度重疊。 Spark SQL 幾乎是 HiveQL 的超集
  2. Spar SQL 不是 HiveQL 的子集; 關於后半部分,是因為在SQL:2003標准中引入了像謂詞這樣的正則表達式 Spark SQL 是 SQL:2003 兼容的,HiveQL 只實現了 SQL:2003 中引入的極少數特性,在少數特性中, rlike沒有包含在 HiveQL 中。
  3. 您必須查看 Spark 的源代碼 實際上,在我看來,只需要記住 Spark SQL 可以幫助您從各種數據源讀取和寫入數據,它涵蓋了 HiveQL。 Spark SQL 被賦予了 HiveQL 的大部分功能。
  4. 不完全是。 Spark SQL 是 Spark SQL。啟用您提到的功能后,通常意味着您將與 Apache Hive 進行通信。即使您沒有 Apache Hive 的實體,您也可以利用啟用的某些功能HiveQL via Spark SQL因為 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 年。Learning Spark:快如閃電的數據分析 第二版。 加利福尼亞州塞瓦斯托波爾:O'Reilly,第 83-112 頁。
  2. ISO/IEC JTC 1/SC 32 數據管理和交換,1992 年,信息技術 - 數據庫語言 - SQL ,ISO/IEC 9075:1992,美國
  3. ISO/IEC JTC 1/SC 32 數據管理和交換,2003 年,信息技術 — 數據庫語言 — SQL — 第 2 部分:基礎 (SQL/Foundation) ,ISO/IEC 9075-2:2003,美國
  4. 懷特,T.(2015 年)。 Hadoop:權威指南。 第 4 版 Sebastopol,O'Reilly Media,第 471-518 頁。
  5. cwiki.apache.org 2013. LanguageManual LateralView [在線]網址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual
  6. 火花.apache.org 2021. Hive 表 [在線] 網址:https://spark.apache.org/docs/latest/sql-data-sources-hive-tables.html

Spark 文檔列出了已知的不兼容性

由於 spark 解析器中的錯誤,我還發現了一些不兼容問題。 看起來 hive 更健壯。

本答案中所述,您可能還會發現 spark 序列化/脫焦實現方面的差異。 基本上你必須調整這些屬性:

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

但要注意它會降低性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM