首页 > 解决方案 > pyspark,通过别名按数组特定属性分组

问题描述

我的数据框有这个结构

root: array (nullable = true)
 |-- element: struct (containsNull = true)
    |-- id: long (nullable = true)
    |-- time: struct (nullable = true)
        |-- start: string (nullable = true)
        |-- end: string (nullable = true)
    |-- properties: array (nullable = true)
        |-- element: struct (containsNull = true)
             |-- key: string (nullable = true)
             |-- value: string (nullable = true)

我需要在这个中进行改造:

 root
     |-- start: string (nullable = true)
     |-- end: string (nullable = true)
     |-- id: long (nullable = true)
     |-- key: string (nullable = true)
     |-- value: string (nullable = true)

在列上扩展我的键值数组。

使用 pivot 和 groupby 我可以转换我的数据框:

df2 = df.groupby("start","end","id").pivot("prop.key").agg(last("prop.value", True))

但我还需要按一个(或多个)属性(键)值分组,但我不能。

df2 = df.groupby("start","end","id","car_type","car_loc").pivot("prop.key").agg(last("prop.value", True))

其中“car_type”、“car_loc”是属性(prop.keys)。我需要通过它们的别名调用这些属性(不使用 getItem())。可能吗?任何人都可以帮助我吗?

谢谢你

编辑

一个例子。我有这种情况:

+---+----------+----------+--------------------+
| id|  start   |    end   |                prop|
+---+----------+----------+--------------------+
|  1|2019-05-12|2020-05-12|[car_type, fiat     |
|  1|2019-05-12|2020-05-12|[car_loc, home      |
|  1|2019-05-12|2020-05-12|[car_num, xd7890    |
|  2|2019-05-13|2020-05-13|[car_type, fiat     |
|  2|2019-05-13|2020-05-13|[car_loc, home      |
|  2|2019-05-13|2020-05-13|[car_num, ae1234    |
|  1|2019-05-12|2020-05-12|[car_type, ford     |
|  1|2019-05-12|2020-05-12|[car_loc, office    |
|  1|2019-05-12|2020-05-12|[car_num, gh7890    |

我需要转换数据框以了解情况:

+---------------------+---+--------+-------+-------+
|  start   |    end   | id|car_type|car_loc|car_num|
+---------------------+---+--------+-------+-------+
|2019-05-12|2020-05-12|  1|fiat    |home   |xd7890 |
|2019-05-13|2020-05-13|  2|fiat    |home   |ae1234 |
|2019-05-12|2020-05-12|  1|ford    |office |gh7890 |

标签: pythonjsonpyspark

解决方案


推荐阅读