У меня есть этот фрейм данных, который имеет схему с картой, как показано ниже:
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, однако я уверен, что есть способ выполнить sh то, что я хочу, только с помощью фреймов данных и 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|
Кроме того, с имеющимся у меня фреймом данных моя проблема заключается в узнайте, как разбить массив на несколько столбцов. Я упоминаю эту причину, потому что я могу либо работать с этим, либо выполнить более эффективный процесс для создания кадра данных на основе карты, которую мне дали.