如何在 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 数据湖容器中的所有内容传输到另一个容器?