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作为数据库。下面是它的驱动程序:create .io/docs/jdbc/en/latest

可能切换到使用Postgres JDBC与createdb而不是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)

相关内容

  • 没有找到相关文章

最新更新