Как разделить значения из map_keys () на несколько столбцов в PySpark - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть этот фрейм данных, который имеет схему с картой, как показано ниже:

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|

Кроме того, с имеющимся у меня фреймом данных моя проблема заключается в узнайте, как разбить массив на несколько столбцов. Я упоминаю эту причину, потому что я могу либо работать с этим, либо выполнить более эффективный процесс для создания кадра данных на основе карты, которую мне дали.

1 Ответ

0 голосов
/ 30 апреля 2020

Я нашел решение своей проблемы. Мне нужно было go об этом подходе ( Создать фрейм данных из хеш-карты с ключами в качестве имен столбцов и значениями в виде строк в Spark ) и выполнить эти серии вычислений на 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|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...