在 Spark 数据帧(scala)中保存地图值时出错 - 预期列,实际 Map [int,string]

Error while saving map value in Spark dataframe(scala) - Expected column, actual Map[int,string]

我在 Map[int,string] 中有键值对。我需要使用 spark 数据框将此值保存在 Hive table 中。但我收到错误 - Expected column, actual Map[int,string]

代码:

val dbValuePairs = Array(2019,10)
val dbkey = dbValuePairs.map(x => x).zipWithIndex.map(t => (t._2, t._1)).toMap

val dqMetrics = spark.sql("select * from dqMetricsStagingTbl")
  .withColumn("Dataset_Name", lit(Dataset_Name))
  .withColumn("Key", dbkey)
dqMetrics.createOrReplaceTempView("tempTable")

spark.sql("create table if not exists hivetable AS select * from tempTable")

dqMetrics.write.mode("append").insertInto(hivetable)

请帮忙! withColumn("Key", dbkey)

中的错误

查看Spark函数withColumn签名:

def withColumn(colName: String, col: Column): DataFrame 

它有两个参数:colName 作为 Stringcol 作为 Column

您的 dbkey 类型是 Map[Int, Int] 而不是 Column:

val dbkey: Map[Int, Int] = dbValuePairs.map(x => x).zipWithIndex.map(t => (t._2, t._1)).toMap

如果您想在 table 列中存储 Map,您可以使用 map 函数,该函数采用 Column:

的序列
// from object org.apache.spark.sql.functions
def map(cols: Column*): Column

因此您可以将您的 dbkey 转换为 Seq[Column] 并将其传递给 withColumn 函数:

val dbValuePairs = Array(2019,10)
val dbkey: Map[Int, Int] = dbValuePairs.map(x => x).zipWithIndex.map(t => (t._2, t._1)).toMap
val dbkeyColumnSeq: Seq[Column] = dbkey.flatMap(t => Seq(lit(t._2), lit(t._1))).toSeq

val dqMetrics = spark.sql("select * from dqMetricsStagingTbl")
  .withColumn("Dataset_Name", lit(""))
  .withColumn("Key", map(dbkeyColumnSeq:_*))