【问题标题】:Explode nested arrays in pyspark在 pyspark 中展开嵌套数组
【发布时间】:2020-05-18 22:49:03
【问题描述】:

我正在 pyspark 中查看以下 DataFrame 架构(为保护隐私而更改了名称)。

|-- some_data: struct (nullable = true)
|    |-- some_array: array (nullable = true)
|    |    |-- element: struct (containsNull = true)
|    |    |    |-- some_nested_array: array (nullable = true)
|    |    |    |    |-- element: struct (containsNull = true)
|    |    |    |    |    |-- some_param_1: long (nullable = true)
|    |    |    |    |    |-- some_param_2: string (nullable = true)
|    |    |    |    |    |-- some_param_3: string (nullable = true)
|    |    |    |-- some_param_4: string (nullable = true)
|    |    |    |-- some_param_5: string (nullable = true)
|    |-- some_other_array: array (nullable = true)
|    |    |-- element: struct (containsNull = true)
|    |    |    |-- some_param_6: string (nullable = true)
|    |    |    |-- some_param_7: string (nullable = true)
|    |-- yet_another_array: array (nullable = true)
|    |    |-- element: struct (containsNull = true)
|    |    |    |-- some_param_8: string (nullable = true)
|    |    |    |-- some_param_9: string (nullable = true)

我正在努力在双重嵌套数组上使用explode 函数。理想情况下,我希望以某种方式访问​​some_array 下方的参数,以便我可以比较 some_param_1 到 9 - 甚至只是 some_param_1 到 5。

【问题讨论】:

  • 你能展示你的代码以及你遇到了什么错误吗?

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

请将列转换为json 并使用json_path 获取每个参数作为列。 示例代码如下-

df.selectExpr("get_json_object(to_json(struct(some_data)),
 '$.some_data.some_array[0].some_nested_array[0].some_param_1') as some_param_1",
 ...<add_others>).show(false)

// compare each param as column here

如果你不熟悉json路径,那么-

  1. 获取通过 -
  2. 创建的 json
df.selectExpr(to_json(struct(some_data))).show(false)
  1. 将结果单元格中的json复制到https://jsonpathfinder.com/的左象限,在这里您将看到对象树层次结构。现在,点击some_param_1 节点
  2. 复制同一页面上的路径并将x替换为$
  3. 把它作为get_json_object 的第二个参数,你就完成了
  4. 一旦获得各个参数列,您就可以进行处理了。

【讨论】:

    【解决方案2】:

    你可以分两步分解嵌套数组:首先分解外部数组,然后分解嵌套内部数组:

    from pyspark.sql.functions import explode
    
    df2 = df.withColumn("exploded_some_array", \
                        explode("some_data.some_array"))
    df2 = df2.withColumn("exploded_some_nested_array", \
                         explode("exploded_some_array.some_nested_array"))
    df2.select("exploded_some_nested_array.*", \
               "exploded_some_array.some_param_4", \
               "exploded_some_array.some_param_5").show(truncate=False)
    

    打印some_param_1some_param_5 的5 列。

    添加剩余两个数组的列很简单:

    df2 = df2.withColumn("exploded_some_other_array", explode("some_data.some_other_array"))
    df2 = df2.withColumn("exploded_yet_another_array", explode("some_data.yet_another_array"))
    df2.select("exploded_some_nested_array.*", \
               "exploded_some_array.some_param_4", \
               "exploded_some_array.some_param_5", \
               "exploded_some_other_array.*", \
               "exploded_yet_another_array.*").show(truncate=False)
    

    some_param_1some_param_9 的所有列打印为平面表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      相关资源
      最近更新 更多