无法在Spark DataFrame中对MapType列进行分组

时间:2019-05-13 10:46:50

标签: scala apache-spark

我当前的问题是以下问题...

Exception in thread "main" org.apache.spark.sql.AnalysisException: expression 'mapField' cannot be used as a grouping expression because its data type map<string,string> is not an orderable data type.;;

我想要实现的基本上只是在DataFrame中按给定的一组列对条目进行分组,但是在与MapType列(如前所述)进行分组时似乎失败了。

  .groupBy(
    ...
    "mapField",
    ...
  )

我有几个主意,但必须有一种比我之前考虑的解决方案更简单的方法来解决此问题...

  • 我已经将每个元素的键值保存在DF的串联字符串中,所以我可以将其解析为Map,然后使用withColumn保存,但是没有找到任何方法,我也无法使我工作。这样做合理吗?

  • 解析为RDD并将其分组,然后返回DF(我认为太麻烦了)

编辑

示例输入

   id    |  myMap
'sample' |  Map('a' -> 1, 'b' -> 2, 'c' -> 3)

所需的输出

   id    |  a  |  b  |  c
'sample' |  1  |  2  |  3

1 个答案:

答案 0 :(得分:2)

下一步可以使用map_valuesmap_keys

import org.apache.spark.sql.functions.{map_values, map_keys}
val df = Seq(
    (Map("k1"->"v1"), 12),
    (Map("k2"->"v2"), 11),
    (null, 10) 
).toDF("map", "id")

df.select(map_values($"map")).show

// +---------------+
// |map_values(map)|
// +---------------+
// |           [v1]|
// |           [v2]|
// |           null|
// +---------------+

df.select(map_keys($"map")).show

// +-------------+
// |map_keys(map)|
// +-------------+
// |         [k1]|
// |         [k2]|
// |         null|
// +-------------+

df.withColumn("key", map_keys($"map").getItem(0)).show

// +----------+---+----+
// |       map| id| key|
// +----------+---+----+
// |[k1 -> v1]| 12|  k1|
// |[k2 -> v2]| 11|  k2|
// |      null| 10|null|
// +----------+---+----+

或直接与groupBy

df.groupBy(map_keys($"map").getItem(0)).count()