我是spark的新手,我有一个数组列,想把它切成多列,该怎么操作呢?期待你的解答。
Input:
+-------+-----------------------------------------------------------------+
|name |subjects |
+-------+-----------------------------------------------------------------+
|Michael|[{"subject": "english", score:100},{"subject": "math", score:80}]|
|John |[{"subject": "english", score:75},{"subject": "math", score:66}] |
+-------+-----------------------------------------------------------------+
Output:
+-------+-------+----+
|name |english|math|
+-------+-------+----+
|Michael|100 |80 |
|John |75 |66 |
+-------+-------+----+
1条答案
按热度按时间guz6ccqo1#
你能保证subjects列中的所有值都有相同的“键”,也就是subjects吗?在一般情况下,你不能把数组值转换成列,因为不同行中的数组可能有不同的(而且很大)数量的元素。如果你确实知道所有行中subjects字段的长度相同,顺序相似,你可以手动完成
等等
如果不确定顺序,可以对数组进行排序,虽然我不确定数组Map是如何排序的,可以使用UDF来提取分数,这样就不依赖于顺序了。
如果事先不知道主题,可以先收集所有主题名称,然后生成添加列所需的代码。
另一种处理数组中条目顺序的方法是将map数组转换为一个以subject为键的map。使用udf很容易,但可以使用spark函数完成,其中包含两个
explode
,然后是groupBy
和map_from_entries
或map_from_arrays
。您仍然需要使用序列withColumn
将map条目转换为列实际上,看起来你可以用
transform
把map转换成map,用struct替换map,然后用map_from_entries
把它转换成map,不需要udf
或explode
。这将创建下表
如果数组是JSON编码的字符串数组而不是Map数组,则代码更改如下
最后,创建列的代码