Spark DataFrame 写入 JDBC - 无法获取 array<array 的 JDBC 类型<int>>



我正在尝试通过JDBC保存数据帧(到postgres(。其中一个字段的类型为Array[Array[Int]]。没有任何铸造,它失败了

Exception in thread "main" java.lang.IllegalArgumentException: Can't 
get JDBC type for array<array<int>>
at ... (JdbcUtils.scala:148)

我向数组数据类型添加了显式强制转换以指导转换:

val df = readings
.map { case ((a, b), (_, d, e, arrayArrayInt)) => (a, b, d, e, arrayArrayInt) }
.toDF("A", "B", "D", "E", "arrays")
edgesDF
.withColumn("arrays_", edgesDF.col("arrays").cast(ArrayType(ArrayType(IntegerType))))
.drop("arrays")
.withColumnRenamed("arrays_", "arrays")
.write
.mode(SaveMode.ErrorIfExists)
.jdbc(url = dbURLWithSchema, table = "mytable", connectionProperties = dbProps)

但它仍然失败,但也有同样的例外。

如何让此数据保存到数据库?

您可以将array<array<int>>存储在数据库中,它不支持数据类型作为数组

一种选择是使用简单的udf创建带有分隔符的单个字符串,如下所示

import org.apache.spark.sql.functions._
val arrToString = udf((value: Seq[Seq[Int]]) => {
value.map(x=> x.map(_.toString).mkString(",")).mkString("::")
})
// this udf creates  array<array<int>> to string as 1,2,3::3,4,5::6,7
df.withColumn("eventTime", arrToString($"eventtime"))

嗨,这有帮助!

最新更新