Spark 数据帧将嵌套的 JSON 转换为单独的列



我有一个具有以下结构的 JSON 流,这些 JSON 流被转换为数据帧

{
  "a": 3936,
  "b": 123,
  "c": "34",
  "attributes": {
    "d": "146",
    "e": "12",
    "f": "23"
  }
}

数据帧显示以下输出中的函数结果

sqlContext.read.json(jsonRDD).show
+----+-----------+---+---+
|   a| attributes|  b|  c|
+----+-----------+---+---+
|3936|[146,12,23]|123| 34|
+----+-----------+---+---+

如何将属性列(嵌套的 JSON 结构)拆分为 attributes.d、attributes.e 和 attributes.f 作为单独的列到一个新的数据帧中,以便我可以在新数据帧中将列作为 a、b、c、attributes.d、attributes.e 和 attributes.f

  • 如果要从af命名列:

    df.select("a", "b", "c", "attributes.d", "attributes.e", "attributes.f")
    
  • 如果要以attributes.前缀命名的列:

    df.select($"a", $"b", $"c", $"attributes.d" as "attributes.d", $"attributes.e" as "attributes.e", $"attributes.f" as "attributes.f")
    
  • 如果列的名称是从外部源提供的(例如配置):

    val colNames: Seq("a", "b", "c", "attributes.d", "attributes.e", "attributes.f")
    df.select(colNames.head, colNames.tail: _*).toDF(colNames:_*)
    

使用 attributes.d 表示法,可以创建新列,并将这些列包含在数据帧中。看看 Java 中的 withColumn() 方法。

使用 Python

  1. 使用 python 的 pandas Lib 提取数据帧。
  2. 将数据类型从"str"更改为"dict"。
  3. 获取每个要素的值。
  4. 将结果保存到新文件。

    import pandas as pd
    data = pd.read_csv("data.csv")  # load the csv file from your disk
    json_data = data['Desc']        # get the DataFrame of Desc
    data = data.drop('Desc', 1)     # delete Desc column
    Total, Defective = [], []       # setout list
    for i in json_data:
        i = eval(i)     # change the data type from 'str' to 'dict'
        Total.append(i['Total'])    # append 'Total' feature
        Defective.append(i['Defective'])    # append 'Defective' feature
    # finally,complete the DataFrame
    data['Total'] = Total
    data['Defective'] = Defective
    data.to_csv("result.csv")       # save to the result.csv and check it
    

相关内容

  • 没有找到相关文章

最新更新