如何将 map_keys() 中的值拆分为 PySpark 中的多列

How to split values from map_keys() into multiple columns in PySpark

我有这个数据框,它有一个带有如下地图的模式:

root
 |-- events: map (nullable = true)
 |    |-- key: string
 |    |-- value: string (valueContainsNull = true)

当我分解它或使用 map_keys() 获取这些值时,我得到以下数据框:

+--------------------+--------------------+
|            map_data|          map_values|
+--------------------+--------------------+
|[[{event_name=walk..|[{event_name=walk...|
|[[{event_name=walk..|          2019-02-17|
|[[{event_name=walk..|            08:00:00|
|[[{event_name=run...|[{event_name=walk...|
|[[{event_name=fly...|          2019-02-17|
|[[{event_name=run...|            09:00:00|
+--------------------+--------------------+

这是我获取上面显示的数据框的代码:

events = event_data\
   .withColumn(
      "map_data", 
      F.map_values(event_data.events)
   )
events.printSchema()
events.select("map_data")
   .withColumn(
      "map_values", 
      F.explode(events.map_data)
   ).show(10)

从一开始,我认为这是一个里程碑,但是,我希望我的数据框看起来像这样:

+--------------------+-----------+--------+
|          events    |     date  |   time |
+--------------------+-----------+--------+
|[{event_name=walk...| 2019-02-17|08:00:00|
|[{event_name=walk...| 2019-02-17|09:00:00|
+--------------------+-----------+--------+

我一直在研究,我看到人们正在使用 udf,但是,我确信有一种方法可以完全使用数据帧和 sql 函数来完成我想要的。

要了解更多信息,请查看没有 .show(truncate=False) 时我的行的样子

+--------------------+--------------------+
|            map_data|          map_values|
+--------------------+--------------------+
|[[{event_name=walk..|[{event_name=walk, duration=0.47, x=0.39, y=0.14, timestamp=08:02:30.574892}, {event_name=walk, duration=0.77, x=0.15, y=0.08, timestamp=08:02:50.330245}, {event_name=run, duration=0.02, x=0.54, y=0.44, timestamp=08:02:22.737803}, {event_name=run, duration=0.01, x=0.43, y=0.56, timestamp=08:02:11.629404}, {event_name=run, duration=0.03, x=0.57, y=0.4, timestamp=08:02:22.660778}, {event_name=run, duration=0.02, x=0.49, y=0.49, timestamp=08:02:56.660186}]|
|[[{event_name=walk..|          2019-02-17|
|[[{event_name=walk..|            08:00:00|

此外,对于我现在拥有的数据框,我的问题是找出如何将数组分解为多列。我提到这个是因为我可以使用它或执行更有效的过程来根据给我的地图创建数据框。

我找到了解决问题的方法。我需要采用这种方法 () 并在 event_data 这是我初始化的数据帧上执行这些系列的计算。

这是我的数据框现在的样子

|25769803776|2019-03-19|[{event_name=walk, duration=0.47, x=0.39, y=0.14, timestamp=08:02:30.574892}, {event_name=walk, duration=0.77, x=0.15, y=0.08, timestamp=08:02:50.330245}, {event_name=run, duration=0.02, x=0.54, y=0.44, timestamp=08:02:22.737803}, {event_name=run, duration=0.01, x=0.43, y=0.56, timestamp=08:02:11.629404}, {event_name=run, duration=0.03, x=0.57, y=0.4, timestamp=08:02:22.660778}, {event_name=run, duration=0.02, x=0.49, y=0.49, timestamp=08:02:56.660186}]|08:02:00|