【问题标题】:How to extract data from MapType Scala Spark Column as Scala Map?如何从 MapType Scala Spark Column 中提取数据作为 Scala Map?
【发布时间】: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


    【解决方案1】:

    .getMap 是一种类型化方法,它无法推断地图上的类型,所以你必须实际告诉它:

    val myHappyMap: Map[String, String] = someDF.select($"songs").head().getMap[String, String](0).toMap
    

    最后的 toMap 只是将它从 scala.collection.Map 转换为 scala.collection.immutable.Map (它们是不同的东西,当你声明类型时通常你指的是第二个)(编辑)

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      相关资源
      最近更新 更多