簡體   English   中英

Spark JDBC SQL 連接器“SELECT INTO”聲明

[英]Spark JDBC SQL connector "SELECT INTO" Statement

我正在嘗試從 SQL 服務器讀取數據。 由於某些要求,我需要使用SELECT INTO語句創建一個臨時表,該表將在查詢中進一步使用。 但是當我運行查詢時,出現以下錯誤

com.microsoft.sqlserver.jdbc.SQLServerException:關鍵字“INTO”附近的語法不正確

我的問題是,Spark SQL 連接器是否允許使用SELECT INTO語句?

這是一個示例查詢和代碼

    drivers = {"mssql": "com.microsoft.sqlserver.jdbc.SQLServerDriver"}
    sparkDf = spark.read.format("jdbc") \
        .option("url", connectionString) \
        .option("query", "SELECT * INTO #TempTable FROM Table1") \
        .option("user", username) \
        .option("password", password) \
        .option("driver",  "com.microsoft.sqlserver.jdbc.SQLServerDriver") \
        .load()

這是因為司機正在做額外的事情,這會妨礙你。 更明確地說,這里記錄了問題。 這是該頁面中您正在使用的“查詢”選項的文檔:

將用於將數據讀入 Spark 的查詢。 指定的查詢將用括號括起來並用作 FROM 子句中的子查詢。 Spark 還將為子查詢子句分配一個別名。 例如,spark 將向 JDBC 源發出以下形式的查詢。

SELECT FROM (<user_specified_query>) spark_gen_alias

以下是使用此選項時的一些限制。

 It is not allowed to specify dbtable and query options at the same time. It is not allowed to specify query and partitionColumn options at the same time. When specifying partitionColumn option is required, the

可以使用 dbtable 選項指定子查詢,並且可以使用作為 dbtable 的一部分提供的子查詢別名來限定分區列。 示例: spark.read.format("jdbc").option("url", jdbcUrl).option("query", "select c1, c2 from t1").load()

從本質上講,驅動程序圍繞您的代碼放置的包裝器會導致問題。 而且因為他們的包裝器以SELECT * FROM (並以) spark_generated_alias ,所以你在如何“突破”它並仍然執行你想要的語句方面非常有限。

這是我的做法。

我將它分成 3 個單獨的查詢,因為普通 (#) 和全局 (##) 臨時表不起作用(驅動程序在每次查詢后斷開連接)。

查詢一:

SELECT 1 AS col) AS tbl; --terminates the "SELECT * FROM (" the driver prepends

--Write whatever Sql you want, then select into a new "real" table.
--E.g. here's your example, but with a "real" table.
SELECT * INTO _TempTable FROM Table1;

SELECT 1 FROM (SELECT 1 AS col --and the driver will append ") spark_generated_alias". The driver ignores all result-sets but the first.

查詢 2:

SELECT * FROM _TempTable;

查詢 3(在完成 DataFrame 之后才能運行它):

SELECT 1 AS col) AS tbl; --terminates the "SELECT * FROM (" the driver prepends

DROP TABLE IF EXISTS _TempTable;

SELECT 1 FROM (SELECT 1 AS col --and the driver will append ") spark_generated_alias". The driver ignores all result-sets but the first.

暫無
暫無

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

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