在 Python 中读取 SQL 文件以通过 databricks 对 JDBC 运行

Posted

技术标签:

【中文标题】在 Python 中读取 SQL 文件以通过 databricks 对 JDBC 运行【英文标题】:Read a SQL file in Python to run against a JDBC via databricks 【发布时间】:2021-01-15 18:45:00 【问题描述】:

我有一个 SQL 语句,我想使用 databricks 中的 JDBC 驱动程序对 oracle 数据库运行。如果 SQL 语句很短,我可以让它成功运行,例如,如果它只是从没有过滤器的表中选择所有数据等。(例如 select * from tbl)

但是,我有一个非常长的 SQL 代码需要执行,因此我通过从保存在 databricks 文件存储中的 .sql 文件加载它来创建要传递给 JDBC 驱动程序的字符串。

运行此程序时出现错误,在调查/打印文本文件的结果时,我发现它删除了一些 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 的 databricks 使用 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)

【问题讨论】:

【参考方案1】:

这不是错误,它只是一个警告,表示输出被截断以防止浏览器过载等。您可以通过集群的 Spark UI 查看驱动程序和执行程序日志 - 应该有更多信息。 ..

我还建议首先尝试直接针对 Oracle 执行该语句,以检查它是否有效

【讨论】:

感谢您的回复。通过 toad / sql developer 直接在服务器上运行时,相同的查询成功执行。 看来这个问题与我错过了我正在按下的查询周围的括号有关!

以上是关于在 Python 中读取 SQL 文件以通过 databricks 对 JDBC 运行的主要内容,如果未能解决你的问题,请参考以下文章

python--008文件处理

Python读取Excel

如何通过python读取30G parquet文件

在 Python 中读取大量 json 文件?

Python读取配置文件,并连接数据库SQL Server

读取文本文件以将数据插入 Oracle SQL 表