用Python读取SQL文件,通过数据库块在JDBC上运行



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

然而,我有一个非常长的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,我使用python 3.7.5通过运行时7.4的databricks:

%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)

这不是一个错误,它只是一个警告,表示输出被截断以防止浏览器过载等。你可以查一查《司机手册》。执行器日志通过Spark UI的集群-应该有更多的信息…

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

相关内容

  • 没有找到相关文章

最新更新