spark 2.2无法处理聚合表达式中的映射列

时间:2018-10-07 20:13:24

标签: apache-spark dictionary apache-spark-sql distinct

如何GROUP BY或将DISTINCT与地图一起使用复杂类型的列?:

case class Foo(id:Int, stuff:Map[String, Int])
  val xx = Seq(Foo(1, Map("first" -> 1, "second"->2)), Foo(1, Map("first" -> 1, "second"->2)), Foo(3, Map("fourth" -> 4, "fifth"->5))).toDF
  xx.distinct.show
  xx.groupBy("id", "stuff").count.show

错误是

expression `stuff` cannot be used as a grouping expression because its data type map<string,int> is not an orderable data type

它似乎与https://mapr.com/support/s/article/Spark-SQL-queries-on-Map-column-fails-with-exception-Cannot-have-map-type-columns-in-DataFrame有关?

也许已在Spark 2.4中修复?

但是,我目前仅限于2.2。 2.2有解决方案吗?

是否可以将其转换为json?我需要每个记录(spark dynamically create struct/json per group)具有不同字段的结构。

编辑

  • 手动序列化为JSON是一种解决方法(但相当笨拙)
  • 除了使用地图类型列之外,我还可以使用自定义案例类(即Seq[Foo]; case class Foo(column:String, column_value:String, value:String))数组。这样可以使DISTINCT正常工作,但是对于任何第三方来说,格式似乎都不太直观

0 个答案:

没有答案