Spark Dataframe:从 Map 类型生成元组数组

Posted

技术标签:

【中文标题】Spark Dataframe:从 Map 类型生成元组数组【英文标题】:Spark Dataframe: Generate an Array of Tuple from a Map type 【发布时间】:2017-05-14 11:19:14 【问题描述】:

我的下游源不支持 Map 类型,而我的源支持并因此发送此。我需要将此映射转换为结构数组(元组)。

Scala 支持 Map.toArray,它为您创建一个元组数组,这看起来像是我需要在 Map 上转换的函数:


  "a" : 
    "b": 
      "key1" : "value1",
      "key2" : "value2"
    ,
    "b_" : 
      "array": [
        
          "key": "key1",
          "value" : "value1"
        ,
        
          "key": "key2",
          "value" : "value2"
        
      ]
    
  

假设要更改的字段也是嵌套字段,Spark 中最有效的方法是什么。例如

a 是根级数据框列

a.b 是级别 1 的地图(来自源)

a.b_ 是 struct 的数组类型(这是我在将 a.b 转换为数组时想要生成的)

到目前为止的答案是我认为的一些方式,只是可以获得 withColumn 和 UDF 建议生成如下。

谢谢!

【问题讨论】:

您能用一些示例源数据更新您的问题吗?您需要数据框或 rdd 方面的帮助吗? 感谢刚刚在 DataFrame 中而不是 RDD 中这样做。认为当前的 UDF 答案很接近,不能让嵌套工作。此外,最好能够更通用地指定类型以便重用,因为我们有 string -> boolean、string -> string 和 string -> int 映射。希望你能帮忙谢谢 嗨,Ramesh,这些信息对您来说够用了吗?谢谢大家 @ramesh-maharjan 新信息是否足够,您可以帮忙吗?谢谢! :) 我以为你已经得到了答案,因为你接受了一个答案。让我看看我能做些什么。给我一些时间。 【参考方案1】:

只需使用udf

val toArray = udf((vs: Map[String, String]) => vs.toArray)

并根据需要调整输入类型。

【讨论】:

非常感谢您的回复,如果我需要重命名元组键和值字段名称(从 col_1 和 col_2 到键和值)怎么办? ...另外,如果您查看 [link] (dropbox.com/s/cbagegoiiomei9d/…),我正在尝试设置作为数组输入的 availability.available_ 字段(使用上面的可用字段作为地图输入)结构类型....正在尝试 val availability_DF = allProductsDF .select("*") .withColumn("availability.available_", toArray($"availability.available")) 但当然没有将其添加到嵌套结构 对此的任何额外帮助将不胜感激! 我更新了描述中的示例数据框,您能否扩展您的 udf 解决方案以适应嵌套位置。 a.b 是我的输入,a.b_ 是我需要的,但元素在树中的嵌套级别,a 是根?请参考描述中的示例,谢谢! 感谢这一点 - 如果我需要在结果元组中使用与自动生成的 _1、_2 不同的键和值名称(例如... ["_1": "aKey","_2":"aValue"] 改为 ...... ["key":"aKey","value":"aValue"] 你会如何更新 UDF 来这样做?非常感谢!

以上是关于Spark Dataframe:从 Map 类型生成元组数组的主要内容,如果未能解决你的问题,请参考以下文章

使用复杂类型查询 Spark SQL DataFrame

将Spark Dataframe转换为Scala Map集合

Spark---DataFrame

Spark DataFrame ArrayType 或 MapType 用于检查列中的值

从嵌套字典创建 Spark DataFrame

spark dataframe 和 scala Map互相转换