我正在使用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)