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

时间:2016-07-10 19:52:52

标签: apache-spark apache-spark-sql spark-dataframe

我有一个JSON流,其结构如下,转换为dataframe

{
  "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 作为 seperate 列到新数据框中,所以我可以在新数据框中将列作为a,b,c,attributes.d,attributes.e和attributes.f吗?

3 个答案:

答案 0 :(得分:2)

  • 如果您希望从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:_*)
    

答案 1 :(得分:1)

使用attributes.d表示法,您可以创建新列,并在DataFrame中使用它们。查看Java中的withColumn()方法。

答案 2 :(得分:0)

使用Python

  1. 使用python的pandas Lib提取DataFrame。
  2. 从' str'更改数据类型到了' dict'。
  3. 获取每个功能的值。
  4. 将结果保存到新文件。

    hh