【问题标题】:Convert dataframe to hash-map using Spark Scala使用 Spark Scala 将数据帧转换为哈希映射
【发布时间】:2019-04-22 14:35:26
【问题描述】:

我的数据框看起来像:

+-------------------+-------------+
|        Nationality|    continent|
+-------------------+-------------+
|       Turkmenistan|         Asia|
|         Azerbaijan|         Asia|
|             Canada|North America|
|         Luxembourg|       Europe|
|             Gambia|       Africa|

我的输出应该是这样的:

Map(Gibraltar -> Europe, Haiti -> North America)

所以,我正在尝试将数据框转换为

scala.collection.mutable.Map[String, String]()

我正在尝试使用以下代码:

    var encoder = Encoders.product[(String, String)]
    val countryToContinent = scala.collection.mutable.Map[String, String]()
    var mapped = nationalityDF.mapPartitions((it) => {
        ....
        ....
        countryToContinent.toIterator
    })(encoder).toDF("Nationality", "continent").as[(String, String)](encoder)

    val map = mapped.rdd.groupByKey.collect.toMap

但结果映射有以下输出:

Map(Gibraltar -> CompactBuffer(Europe), Haiti -> CompactBuffer(North America))

如何在没有 CompactBuffer 的情况下获得 hash-map 结果?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    让我们创建一些数据:

    val df = Seq(
    ("Turkmenistan", "Asia"), 
    ("Azerbaijan", "Asia"))
    .toDF("Country", "Continent")
    

    尝试先映射成元组,然后收集成映射:

    df.map{ r => (r.getString(0), r.getString(1))}.collect.toMap
    

    输出:

    scala.collection.immutable.Map[String,String] = Map(Turkmenistan -> Asia, Azerbaijan -> Asia)
    

    【讨论】:

    • 谢谢。它工作正常.. 我刚刚在地图中添加了编码器:: newDF.map{ r => (r.getString(0), r.getString(1))}(encoder).collect.toMap
    • 你好@Hanan你为什么显式添加编码器?在这种情况下,我认为您不需要设置编码器。除非有必要,否则我会避免弄乱编码器 :) 即 Spark 无法识别我的自定义类型的编码!在这里你可以找到关于编码器的很好的解释github.com/vaquarkhan/Apache-Kafka-poc-and-notes/wiki/…
    • 实际上在我添加编码器之前它给出了错误:错误:(58、34)方法映射的参数不足:(隐含证据$6:org.apache.spark.sql.Encoder[(String,字符串)])org.apache.spark.sql.Dataset[(字符串,字符串)]。未指定值参数证据$6。 countryToContinent = newDF.map { r => (r.getString(0), r.getString(1)) }.collect.toMap
    • 对,我知道你应该完全移除编码器!你真的不需要它。只需导入 spark.implicits._ 就足够了
    • 非常感谢!是的,你是对的......使用 spark.implicits 可以正常工作。_
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2016-06-06
    • 2014-08-21
    • 2011-01-16
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多