【问题标题】:Why is dbtable / query required in spark.jdbc为什么 spark.jdbc 中需要 dbtable / query
【发布时间】:2021-08-05 00:23:48
【问题描述】:

我是 SPARK 菜鸟,我不清楚为什么需要将 dbtablequery 作为 JDBC 选项的一部分。

例如将此与 Presto JDBC 驱动程序一起使用,Presto 驱动程序不喜欢 url、驱动程序、dbtable 和查询参数。其他驱动程序执行类似的验证(例如 Presto 的 CData 驱动程序)

url = "jdbc:presto:Server=spill.asifkazi.cp.ahana.cloud;Port=443;"
jdbcDriver = "com.facebook.presto.jdbc.PrestoDriver" 
sqlQuery = "select * from customer limit 1"
jdbcOptions = spark.read.format("jdbc")
jdbcOptions.option("url",jdbcUrl)
jdbcOptions.option("user", user)
jdbcOptions.option("password", password)
jdbcOptions.option("query",sqlQuery)
df = jdbcOptions.load()
df.show()
21/05/13 21:50:41 INFO SharedState: Warehouse path is 'file:/Users/asifkazi/Downloads/Projects/pyspark/spark-warehouse'.
Traceback (most recent call last):
  File "/Users/asifkazi/Downloads/Projects/pyspark/test_jdbc.py", line 32, in <module>
    df = jdbcOptions.load()
  File "/usr/local/Cellar/apache-spark/3.1.1/libexec/python/lib/pyspark.zip/pyspark/sql/readwriter.py", line 210, in load
  File "/usr/local/Cellar/apache-spark/3.1.1/libexec/python/lib/py4j-0.10.9-src.zip/py4j/java_gateway.py", line 1304, in __call__
  File "/usr/local/Cellar/apache-spark/3.1.1/libexec/python/lib/pyspark.zip/pyspark/sql/utils.py", line 111, in deco
  File "/usr/local/Cellar/apache-spark/3.1.1/libexec/python/lib/py4j-0.10.9-src.zip/py4j/protocol.py", line 326, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o35.load.
: java.sql.SQLException: Unrecognized connection property 'driver'
    at com.facebook.presto.jdbc.PrestoDriverUri.validateConnectionProperties(PrestoDriverUri.java:353)
    at com.facebook.presto.jdbc.PrestoDriverUri.<init>(PrestoDriverUri.java:104)
    at com.facebook.presto.jdbc.PrestoDriverUri.<init>(PrestoDriverUri.java:94)
    at com.facebook.presto.jdbc.PrestoDriver.connect(PrestoDriver.java:87)
    at org.apache.spark.sql.execution.datasources.jdbc.connection.BasicConnectionProvider.getConnection(BasicConnectionProvider.scala:49)
    at 

为什么我不能像在 JDBC 中那样简单地为 spark 创建 JDBC 连接,然后独立运行查询? 有没有办法在不将信息作为 jdbc 选项的一部分传递的情况下完成查询?

【问题讨论】:

    标签: apache-spark jdbc pyspark


    【解决方案1】:

    例如将此与 Presto JDBC 驱动程序一起使用,Presto 驱动程序不喜欢 url、驱动程序、dbtable 和查询参数。其他驱动程序执行类似的验证(例如 Presto 的 CData 驱动程序)

    它应该接受这些选项,请查看https://stackoverflow.com/a/56806009/3441510

    为什么我不能像在 JDBC 中那样简单地为 spark 创建 JDBC 连接,然后独立运行查询?有没有办法在不将信息作为 jdbc 选项的一部分传递的情况下完成查询?

    如果不(立即)在 Spark 上下文中运行实际查询,我看不出有 JDBC 连接的意义。 spark.read.jdbc 的主要目的是建立连接然后与多个执行器并行加载数据,而不是“测试”连接

    【讨论】:

      【解决方案2】:

      您应该包装查询并将其传递给数据库,希望下面的 url 可以正常工作,我没有预先测试它

      query = """(select * from customer limit 1) query_wrap"""
      url = 'jdbc:presto:Server=spill.asifkazi.cp.ahana.cloud;Port=443'
      connectionProperties = {"user": "user" , "password": "paswwrod", "driver": "com.facebook.presto.jdbc.PrestoDriver", "fetchsize": "10000"}
      df = spark.read.jdbc(url = url, table = query, properties = connectionProperties)
      

      【讨论】:

      • 感谢感谢
      • 如果它解决了您的问题,请接受并投票。以便人们可以放心地参考以备将来使用。
      猜你喜欢
      • 2016-12-23
      • 2022-01-20
      • 2020-05-03
      • 2019-06-09
      • 2022-10-16
      • 1970-01-01
      • 2020-03-22
      • 2011-08-11
      • 2019-06-09
      相关资源
      最近更新 更多