PySpark-将JSON对象列表转换为行

时间:2019-11-12 17:13:44

标签: pyspark pyspark-sql

我要转换对象列表并将其属性存储为列。

{
  "heading": 1,
  "columns": [
    {
      "col1": "a",
      "col2": "b",
      "col3": "c"
    },
    {
      "col1": "d",
      "col2": "e",
      "col3": "f"
    }
  ]
}

最终结果

heading | col1 | col2 | col3
1       | a    | b    | c
1       | d    | e    | f

我目前正在整理数据(并且不包括column列)

df = target_table.relationalize('roottable', temp_path)

但是,对于此用例,我将需要columns列。我看到了使用arrays_zipexplode的示例。我需要遍历每个对象,还是有一种更简单的方法来提取每个对象并转换为行?

1 个答案:

答案 0 :(得分:1)

使用Spark SQL内置函数:inlineinline_outer可能是处理此问题的最简单方法(在columns中允许NULL时使用inline_outer):

来自Apache Hive document

  

将结构数组分解为多行。返回具有N列的行集(N =结构中顶级元素的数量),数组中每个结构一行一行。 (从Hive 0.10开始。)

df.selectExpr('heading', 'inline_outer(columns)').show()                                                           
+-------+----+----+----+
|heading|col1|col2|col3|
+-------+----+----+----+
|      1|   a|   b|   c|
|      1|   d|   e|   f|
+-------+----+----+----+