如何将数据框中的rwo列转换为scala中的Map(col1,col2)?
我试过了:
val resultMap = df.select($"col1", $"col2")
.map ({
case Row(a:String, b: String) => Map(a.asInstanceOf[String] ->b.asInstanceOf[String] )
})
但我无法从此地图中获取值。还有其他办法吗?
答案 0 :(得分:0)
地图[字符串,字符串]没有数据集编码器,我甚至不确定你是否真的可以制作一个。
这是两个版本,一个是不安全的,另一个是安全的,可以做你想做的事。实际上,您需要降低到RDD级别才能进行计算:
case class OnFrame(df: DataFrame) {
import df.sparkSession.implicits._
/**
* If input columns don't match we'll fail at query evaluation.
*/
def unsafeRDDMap: RDD[Map[String, String]] = {
df.rdd.map(row => Map(row.getAs[String]("col1") -> row.getAs[String]("col2")))
}
/**
* Use Dataset-to-case-class mapping.
* If input columns don't match we'll fail before query evaluation.
*/
def safeRDDMap: RDD[Map[String, String]] = {
df
.select($"col1" as "key", $"col2" as "value")
.as[OnFrame.Entry]
.rdd
.map(_.toMap)
}
def unsafeMap(): Map[String, String] = {
unsafeRDDMap.reduce(_ ++ _)
}
def safeMap(): Map[String, String] = {
safeRDDMap.reduce(_ ++ _)
}
}
如果您更清楚地提供了您的目标,或许我们可以更有效地将所有内容收集到一张地图中,这是一种潜在的Spark反模式 - 意味着您的数据适合驱动程序。