如何映射spark数据框的每个元素及其各自的列名,并使用scala对其进行少量转换?

时间:2018-05-17 04:49:08

标签: json scala apache-spark dataframe

我有这样的ORC数据(上传为图片)

ORC data when loaded into dataframe

没有为行中的内容定义架构,因此我想将其分解为RDD's并转移到具有一些已定义架构的另一个Dataframe(使用" {{ 1}}")以便我可以阅读JSON。

因此,当我尝试通过选择列来将这些内容分解为RDD时,我就像下面这样

structType

我想像下面那样转换这个RDD,以放入我的已定义架构的Dataframe

[{"a" : 1, "b" : 2, "c" : { "c1": 3, "c2" :4}},{"d" : 5, "e" : 6, "f" : { "f1": 7, "f2" :8}},{"g" : 9, "h" : 10, "i" : { "i1": 11, "i2" :12}}]
[{"a" : 13, "b" : 14, "c" : { "c1": 15, "c2" :16}},{"d" : 17, "e" : 18, "f" : { "f1": 19, "f2" :20}}​,{"g" : 21, "h" : 22, "i" : { "i1": 23, "i2" :24}}​]

我需要的是将行中的每个元素映射到其各自的列名称,并将{"Column 1":{"a" : 1, "b" : 2, "c" : { "c1": 3, "c2" :4}},"Column 2":{"d" : 5, "e" : 6, "f" : { "f1": 7, "f2" :8}},"column 3" :{"g": 9, "h" : 10, "i" : { "i1": 11, "i2" :12}}} {"Column 1":{"a" : 13, "b" : 14, "c" : { "c1": 15, "c2" :16}},"Column 2":{"d" : 17, "e" : 18, "f" : { "f1": 19, "f2" :20}}​,"column 3":{"g" : 21, "h" : 22, "i" : { "i1": 23, "i2" :24}}​} 添加到这些列名称并将整行包装在" "

我无法在{}split,因为JSON可能有嵌套结构,直到2个级别,并且可以在JSON中的任何位置。

如何实现这一目标?

1 个答案:

答案 0 :(得分:-1)

以下是一种将数据框转换为json的方法:

df.toJSON
  .map(_.replace("\\", "")
        .replace("}\"", "}")
        .replace("\"{", "{"))

我正在使用正则表达式删除不需要的字符。请注意,如果您有许多记录,这可能不是非常有效。