如何将复杂的嵌套JSON结构转换为Spark DataFrame中的多列

nc1teljy  于 2023-01-31  发布在  Apache
关注(0)|答案(1)|浏览(219)

我正在学习Scala,并且尝试从一个大型嵌套json文件中筛选出一些列,以使其成为一个DataFrame。

{
  “meta”: 
    {“a”: 1, b: 2”}    // I want to ignore meta
  “objects”:
  [
    {
         “caucus”: “Progressive”,
     “person” : 
         {
          “name”: “Mary”,
          “party”: “Green Party”,
          “age”: 50,
          “gender”: “female” // etc..
         }
    }, // etc.
   ] 
}

因此,数据看起来像这样,用spark读入。

val df = spark.read.json("file")
    df.show()
+--------------------+--------------------+
|                meta|             objects|
+--------------------+--------------------+
|[limit -> 100.0, ...|[[, [116.0, 117.0...|
+--------------------+--------------------+

而不是这样,我想要一个DataFrame与列:姓名|党|核心小组。
我已经对explode()进行了一些修改,并将该模式重新生成为StructType(),但不确定通常如何处理这样的嵌套结构。

ddhy6vgd

ddhy6vgd1#

没有通用的方法来处理它,因为它当然取决于数据的形状。在您的例子中,您希望分解一个数组,这将创建一个名为col的列,该列将包含struct。然后,您可以使用点标记法访问struct中的字段,因此,要提取您要求的字段,您可以执行以下操作:

df.select(explode_outer($"objects")).
  select(
     $"col.caucus", 
     $"col.person.name",
     $"col.person.party").show

+-----------+----+-----------+
|     caucus|name|      party|
+-----------+----+-----------+
|Progressive|Mary|Green Party|
+-----------+----+-----------+

相关问题