Python 在(Py)Spark中读取JDBC源代码时出现不支持的数组错误?

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

正在尝试将postgreSQL DB转换为Dataframe。以下是我的代码:

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)
这应该行得通