在 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
作为 String
和 col
作为 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:_*))
我在 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
作为 String
和 col
作为 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:_*))