spark 2.2 не может обрабатывать столбцы карты в выражении агрегации - PullRequest
0 голосов
/ 07 октября 2018

Как мне 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 работать, но формат кажется довольно не интуитивным для любой третьей стороны
...