如何在 Azure Databricks 中使用 JDBC 从 PostgreSQL 读取表数据?

Posted

技术标签:

【中文标题】如何在 Azure Databricks 中使用 JDBC 从 PostgreSQL 读取表数据?【英文标题】:How to read table data from PostgreSQL using JDBC in Azure Databricks? 【发布时间】:2020-09-05 03:03:32 【问题描述】:

我正在尝试使用 pyspark 读取 Azure 云订阅中可用的 postgreSQL 表,但出现以下错误。我知道当我们使用加载函数时,我们也应该包含格式。但是由于这个 PostgreSQL 实例在不同的 azure 订阅中可用,我根本无法访问 PostgreSQL 数据库,如果是这种情况如何推断架构?或者有没有更好的方法从数据块中读取数据。

df = spark.read.option("url", "jdbc:postgresql://hostname:5432&user=username&password=xxxxx&sslmode=require").option("dbtable", tablename).load()

错误:

 ---------------------------------------------------------------------------
Py4JJavaError                             Traceback (most recent call last)
/databricks/spark/python/pyspark/sql/utils.py in deco(*a, **kw)
     62         try:
---> 63             return f(*a, **kw)
     64         except py4j.protocol.Py4JJavaError as e:

/databricks/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name)
    327                     "An error occurred while calling 012.\n".
--> 328                     format(target_id, ".", name), value)
    329             else:

Py4JJavaError: An error occurred while calling o1169.load.
: org.apache.spark.sql.AnalysisException: Unable to infer schema for Parquet. It must be specified manually.;
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$8.apply(DataSource.scala:211)
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$8.apply(DataSource.scala:211)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.sql.execution.datasources.DataSource.getOrInferFileFormatSchema(DataSource.scala:210)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:421)
    at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:311)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:297)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:203)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:380)
    at py4j.Gateway.invoke(Gateway.java:295)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:251)
    at java.lang.Thread.run(Thread.java:748)


During handling of the above exception, another exception occurred:

【问题讨论】:

【参考方案1】:

错误是因为代码隐式假定格式为parquet。无论定义了哪些选项,它们都会被格式忽略。

换句话说,结构化查询根本不使用使用 JDBC 加载数据。

这就是错误的这一部分(几乎):

org.apache.spark.sql.AnalysisException:无法推断 Parquet 的架构。必须手动指定。;

如果要从 JDBC 数据源中读取数据,则应在查询中包含 format("jdbc")

spark.read.format("jdbc")

【讨论】:

您好@jacekLaskowski,非常感谢您的回复,当我尝试使用 spark.read.format("jdbc") 时出现错误消息:org.postgresql.util.PSQLException:致命:需要 SSL 连接。请指定 SSL 选项并重试 好吧,那是另一个问题了。请阅读官方文档中的JDBC To Other Databases。

以上是关于如何在 Azure Databricks 中使用 JDBC 从 PostgreSQL 读取表数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Azure Databricks 中使用 JDBC 从 PostgreSQL 读取表数据?

如何在 Azure Databricks PySpark 中执行存储过程?

如何在 databricks 工作区中使用 python 获取 azure datalake 存储中存在的每个文件的最后修改时间?

如何使用 databricks 将一个 azure 数据湖容器中的所有内容传输到另一个容器?

使用 Databricks 将文件从 Azure 文件移动到 ADLS Gen 2 并返回

如何使用 Azure Synapse 在 Databricks 上删除表或删除行?