如何将数据帧中的两列转换为scala中的映射(col1,col2)?

如何将数据帧中的两列转换为scala中的映射(col1,col2)?,scala,dictionary,dataframe,Scala,Dictionary,Dataframe,如何在scala中将rwo列从数据帧转换为映射(col1,col2) 我试过: val resultMap = df.select($"col1", $"col2") .map ({ case Row(a:String, b: String) => Map(a.asInstanceOf[String] ->b.asInstanceOf[String] ) }) 但我无法从这张地图上得到值。有没有其他方法可以做到这一点?地图[String,String]

如何在scala中将rwo列从数据帧转换为映射(col1,col2)

我试过:

 val resultMap = df.select($"col1", $"col2")
    .map ({
      case Row(a:String, b: String) => Map(a.asInstanceOf[String] ->b.asInstanceOf[String] )
    })

但我无法从这张地图上得到值。有没有其他方法可以做到这一点?

地图[String,String]没有数据集编码器,我甚至不确定你是否真的可以制作一个

这里有两个版本,一个是不安全的,另一个是安全的,来做你想做的事情。实际上,您需要降低到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(_ ++ _)
  }

}

如果您能更清楚地说明您的目标是什么,也许我们可以更有效地实现这一点,因为将所有内容收集到单个地图中是一种潜在的火花反模式-这意味着您的数据适合驱动程序。

地图[String,String]没有数据集编码器,我甚至不确定您是否真的可以制作一个

这里有两个版本,一个是不安全的,另一个是安全的,来做你想做的事情。实际上,您需要降低到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反模式-这意味着您的数据适合驱动程序。

我使用的是Spark 1.6,数据集概念>2.0。我还可以使用它吗?只有不安全的版本。您的导入必须更改为
df.sqlContext.implicits.\u
。我使用的是spark 1.6,数据集概念>2.0。我还可以使用它吗?只有不安全的版本。您的导入必须更改为
df.sqlContext.implicits.