Python 在(Py)Spark中读取JDBC源代码时出现不支持的数组错误?
正在尝试将postgreSQL DB转换为Dataframe。以下是我的代码:Python 在(Py)Spark中读取JDBC源代码时出现不支持的数组错误?,python,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,正在尝试将postgreSQL DB转换为Dataframe。以下是我的代码: from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Connect to DB") \ .getOrCreate() jdbcUrl = "jdbc:postgresql://XXXXXX" connectionProperties = { "user" : " ", "passwor
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("Connect to DB") \
.getOrCreate()
jdbcUrl = "jdbc:postgresql://XXXXXX"
connectionProperties = {
"user" : " ",
"password" : " ",
"driver" : "org.postgresql.Driver"
}
query = "(SELECT table_name FROM information_schema.tables) XXX"
df = spark.read.jdbc(url=jdbcUrl, table=query, properties=connectionProperties)
table_name_list = df.select("table_name").rdd.flatMap(lambda x: x).collect()
for table_name in table_name_list:
df2 = spark.read.jdbc(url=jdbcUrl, table=table_name, properties=connectionProperties)
我得到的错误是:
java.sql.SQLException:为表名生成df2时不支持类型数组
如果我硬编码表名值,我不会得到相同的错误
df2 = spark.read.jdbc(jdbcUrl,"conditions",properties=connectionProperties)
我检查了表名类型,它是字符串,这是正确的方法吗 我猜您不希望出现属于postgres内部工作的表名,例如
pg\u type
,pg\u policies
等,这些表的模式是导致错误的pg\u catalog
类型
py4j.protocol.Py4JJavaError:调用o34.jdbc时出错。
:java.sql.SQLException:不支持的类型数组
当你试着把它们读作
spark.read.jdbc(url=jdbcUrl, table='pg_type', properties=connectionProperties)
spark.read.jdbc(url=jdbcUrl, table='view_table_usage', properties=connectionProperties)
还有一些表,如适用的\u角色
,查看\u表的使用情况
等,其模式类型为信息\u模式
,导致
py4j.protocol.Py4JJavaError:调用o34.jdbc时出错。
:org.postgresql.util.PSQLException:错误:关系“视图\表格\用法”不存在
当你试着把它们读作
spark.read.jdbc(url=jdbcUrl, table='pg_type', properties=connectionProperties)
spark.read.jdbc(url=jdbcUrl, table='view_table_usage', properties=connectionProperties)
模式类型为公共的表可以使用上述jdbc命令读入表中
我检查了表名类型,它是字符串,这是正确的方法吗
因此,您需要过滤掉这些表名,并将逻辑应用为
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("Connect to DB") \
.getOrCreate()
jdbcUrl = "jdbc:postgresql://hostname:post/"
connectionProperties = {
"user" : " ",
"password" : " ",
"driver" : "org.postgresql.Driver"
}
query = "information_schema.tables"
df = spark.read.jdbc(url=jdbcUrl, table=query, properties=connectionProperties)
table_name_list = df.filter((df["table_schema"] != 'pg_catalog') & (df["table_schema"] != 'information_schema')).select("table_name").rdd.flatMap(lambda x: x).collect()
for table_name in table_name_list:
df2 = spark.read.jdbc(url=jdbcUrl, table=table_name, properties=connectionProperties)
这应该行得通