Spark DataFrame写入JDBC - 不能为数组<array <int>&gt;获取JDBC类型

时间:2017-08-08 08:36:43

标签: scala apache-spark spark-dataframe

我试图通过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)

但它仍然以相同的例外失败。

如何将此数据保存到DB?

1 个答案:

答案 0 :(得分:0)

您可以将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"))

Hipe这有帮助!