如何将数据框中的两列转换为scala中的Map(col1,col2)?

时间:2016-09-26 20:58:53

标签: scala dictionary dataframe

如何将数据框中的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] )
    })

但我无法从此地图中获取值。还有其他办法吗?

1 个答案:

答案 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反模式 - 意味着您的数据适合驱动程序。