簡體   English   中英

如何為(派生的)Spark DataFrame 的查詢邏輯獲取 SQL 表示?

[英]How to get the SQL representation for the query logic of a (derived) Spark DataFrame?

可以將原始 SQL 字符串轉換為 DataFrame。 但是否也有可能反過來,即獲取(派生的)Spark DataFrame 的查詢邏輯的 SQL 表示?

// Source data
val a = Seq(7, 8, 9, 7, 8, 7).toDF("foo")

// Query using DataFrame functions
val b = a.groupBy($"foo").agg(count("*") as "occurrences").orderBy($"occurrences")
b.show()

// Convert a SQL string into a DataFrame
val sqlString = "SELECT foo, count(*) as occurrences FROM a GROUP BY foo ORDER BY occurrences"
a.createOrReplaceTempView("a")
val c = currentSparkSession.sql(sqlString)
c.show()

// "Convert" a DataFrame into a SQL string
b.toSQLString() // Error: This function does not exist.

不可能將 DataFrame 轉換為 SQL 字符串,因為 Spark 不知道如何編寫 SQL 查詢並且不需要。

我發現回憶一下 Spark 如何處理 Dataframe 代碼或 SQL 查詢很有用。 這是由 Spark 的Catalyst Optimizer完成的,它經歷了四個轉型階段,如下所示:

在此處輸入圖像描述

在第一階段(分析)中,Spark SQL 引擎為 SQL 或 Dataframe 查詢生成抽象語法樹 ( AST )。 該樹是 Catalyst 中的主要數據類型(請參閱白皮書Spark SQL:Spark 中的關系數據處理中的第 4.1 節),它用於創建邏輯計划並最終創建物理計划。 如果您使用 Spark 提供的explain API,您將獲得這些計划的表示。

雖然我很清楚“一個可以將原始 SQL 字符串轉換為 DataFrame”的意思,但我想它有助於更精確。 我們沒有SQL 字符串(因此您自己在該詞周圍加上引號)轉換為 Dataframe,但您應用了您的SQL知識,因為這是可以理解的語法。 此外,您不能只輸入任何 SQL 查詢,因為在與目錄進行比較時,這仍然可能在分析階段失敗。 因此,SQL 字符串只是關於 Spark 如何允許您給出指令的協議。 然后這個 SQL 查詢被解析,轉換成一個 AST(如上所述),並在經歷了其他三個階段之后,最終形成一個基於 RDD 的代碼。 The result of this SQL execution through the sql API returns a Dataframe, whereas you can easily transform it into an RDD with df.rdd .

總的來說,Spark 不需要將任何代碼,特別是任何 Dataframe 代碼寫入 SQL 語法,然后您就可以退出 Spark。 AST 是內部抽象,Spark 不需要先將 Dataframe 代碼轉換為 SQL 查詢,而不是直接將 Dataframe 代碼轉換為 AST。

沒有。沒有任何方法可以從 dataframe 中獲取 SQL 查詢。 您必須自己創建查詢,方法是查看用於創建 dataframe 的所有過濾器和 select。

暫無
暫無

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

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