Как мне 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?
Может быть исправлено в свече 2.4?
Однако в настоящее время я ограничен 2.2.Есть ли решение для 2.2?
Может ли оно вместо этого быть преобразовано в json?Мне нужно иметь структуру с разными полями для каждой записи ( spark динамически создает структуру / JSON для группы ).
edit
- , вручную сериализовать в JSONОбходной путь (но довольно неуклюжий)
- вместо использования столбца типа карты, я также могу использовать массив пользовательских классов case, например
Seq[Foo]; case class Foo(column:String, column_value:String, value:String)
.Это позволяет DISTINCT
работать, но формат кажется довольно не интуитивным для любой третьей стороны