PySpark 可以通过 JDBC 驱动程序将字符串数组写入数据库吗?

问题描述

我正在使用 PySpark,我想将一个字符串数组插入到具有 JDBC 驱动程序的数据库中,但出现以下错误

IllegalArgumentException: Can't get JDBC type for array<string>

当我为 UDF 使用 ArrayType(StringType()) 格式时会发生此错误。当我尝试覆盖列类型时:

.option("createTableColumnTypes","col1 ARRAY,col2 ARRAY,col3 ARRAY,col4 ARRAY")

我明白了:

DataType array is not supported.(line 1,pos 18)

这让我怀疑问题是否出在 Spark 3.1.2 中,其中没有数组映射,我必须将其转换为字符串,还是来自我正在使用的驱动程序?

作为参考,我使用 CrateDB 作为数据库。这是它的驱动程序:crate.io/docs/jdbc/en/latest

解决方法

可能改用 Postgres JDBC 和 CrateDB 而不是 crate-jdbc 可以解决您的问题。

使用 CrateCB 4.6.1 和 postgresql 42.2.23 测试的示例 PySpark 程序:

from pyspark.sql import Row

df = spark.createDataFrame([
    Row(a = [1,2]),Row(a = [3,4])
])
df

df.write \
  .format("jdbc") \
  .option("url","jdbc:postgresql://<url-to-server>:5432/?sslmode=require") \
  .option("driver","org.postgresql.Driver") \
  .option("dbtable","<tableName>") \
  .option("user","<username>") \
  .option("password","<password>") \
  .save()
,

您能否尝试为数组添加数据类型,即 ARRAY(TEXT)

.option("createTableColumnTypes","col1 ARRAY(TEXT),col2 ARRAY(TEXT),col3 ARRAY(TEXT),col4 ARRAY(TEXT)")

SELECT ['Hello']::ARRAY;
--> SQLParseException[line 1:25: no viable alternative at input 'SELECT ['Hello']::ARRAY limit']
SELECT ['Hello']::ARRAY(TEXT);
--> SELECT OK,1 record returned (0.002 seconds)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...