簡體   English   中英

讀取 Python 中的 SQL 文件以通過數據塊針對 JDBC 運行

[英]Read a SQL file in Python to run against a JDBC via databricks

我有一個 SQL 語句,我想在數據塊中使用 JDBC 驅動程序針對 oracle 數據庫運行。 如果 SQL 語句很短,我可以讓它成功運行,例如,如果它只是從沒有過濾器的表中選擇所有數據等。(例如 select * 來自 tbl)

但是,我有一個非常長的 SQL 代碼需要執行,因此我正在創建字符串以傳遞給 JDBC 驅動程序,方法是從保存的 databricks 文件中的.sql 文件加載它

運行此程序時,我遇到了一個錯誤,在調查/打印文本文件的結果時,我發現它刪除了一些 SQL 語句並在恢復 sql 語句之前提供了一條消息:

*** WARNING: skipped 62431 bytes of output ***

實際上,它在打印的字符串中看起來像這樣:

    sum (
        case
            when dpr.pricing_Type in ('P', 'C') then
                nvl (
                    decode (dpr.price / 100, null, 0,
                        decode (apr.price, 'N', 

*** WARNING: skipped 62431 bytes of output ***

        then
            dpr.percentage_applied
        else 
            0
        end
    ) as price_percent,

請注意,警告之前的代碼與警告消息之后的代碼的字段完全不同。

有沒有關於此問題的原因以及如何解決的建議?

我正在運行的完整腳本在下面供參考,另請注意,我使用的 .sql 文件只有 113kb,並且我正在通過運行時 7.4 的數據塊使用 python 3.7.5:

%python

# setup jdbc credentials (from key vault) and url
jdbcUsername = dbutils.secrets.get(scope="USER", key="ID")
jdbcPassword = dbutils.secrets.get(scope="PWD", key="PWD")
jdbcUrl = "jdbc:oracle:thin:@<REDACTED>"
jdbcDrv = "oracle.jdbc.driver.OracleDriver"

# Table Name
OutputTbl = "db.tblCore"

# Drop table. 
spark.sql("DROP TABLE IF EXISTS " + OutputTbl  )

# parallelism
lbound = 20160101
ubound = 20210115
fsize = "1000"
colname = "date_value_yyyymmdd"
numParts = "10"

# Get sql stetment from file.
with open('/dbfs/FileStore/shared_uploads/<REDACTED>/SQL', 'r') as f:
    sql = file.read()

# Create DF and write output to a table. 
spdf = (spark.read.format("jdbc")
  .option("driver", jdbcDrv)
  .option("url", jdbcUrl)
  .option("user", jdbcUsername)
  .option("password", jdbcPassword)
  .option("dbtable", sql)
  .option("numPartitions", numParts)
  .option("fetchsize", fsize)
  .option("partitionColumn", colname) 
  .option("lowerBound", lbound)
  .option("upperBound", ubound)
  .load())

spdf.write.mode("overwrite").saveAsTable(OutputTbl)

這不是一個錯誤,它只是一個警告,指出 output 被截斷以防止瀏覽器過載等。您可以通過集群的 Spark UI 查看驅動程序和執行程序日志 - 應該有更多信息......

我還建議首先嘗試直接針對 Oracle 執行該語句,以檢查它是否有效

暫無
暫無

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

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