【发布时间】:2020-03-29 13:15:07
【问题描述】:
嗯,问题差不多就是这样。让我提供样本:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.{DataFrame, Column, Dataset}
val data = List(
Row("miley",
Map("good_songs" -> "wrecking ball",
"bad_songs" -> "younger now"
)
),
Row("kesha",
Map(
"good_songs" -> "tik tok",
"bad_songs" -> "rainbow"
)
)
)
val schema = List(
StructField("singer", StringType, true),
StructField("songs", MapType(StringType, StringType, true))
)
val someDF = spark.createDataFrame(
spark.sparkContext.parallelize(data),
StructType(schema)
)
// This returns scala.collection.Map[Nothing,Nothing]
someDF.select($"songs").head().getMap(0)
// Therefore, this won't work:
val myHappyMap : Map[String, String] = someDF.select($"songs").head().getMap(0)
如果我正确描述了 MapType 列所需的架构,我不明白为什么会得到 Map[Nothing, Nothing] - 不仅如此:当我执行 someDF.schema 时,我得到的是
org.apache.spark.sql.types.StructType = StructType(StructField(singer,StringType,true), StructField(songs,MapType(StringType,StringType,true),true)),表明 DataFrame 架构设置正确。
我读过extract or filter MapType of Spark DataFrame
,也读过How to get keys and values from MapType column in SparkSQL DataFrame
。我认为后者至少可以通过分别提取键和值来解决我的问题,但是,我仍然得到WrappedArray(Nothing) 的值,这意味着它只会增加额外的复杂性而没有真正的收益。
我在这里错过了什么?
【问题讨论】:
标签: scala apache-spark