Перебирайте номера строк раздела и сравнивайте значения для создания новых столбцов в PySpark SQL (spark 2.4.0) - PullRequest
0 голосов
/ 08 февраля 2019

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

Итак, у меня есть кадр данных, представляющий контакты с главным идентификатором <-> ассоциация необработанных идентификаторов (мастер может иметь несколько необработанных).Я разделил этот фрейм данных с оконной функцией и row_number () над разделом самых последних созданных строк:

# Create a window specification to define the partitionning of masters
# base on the most recent created
window_spec = Window \
    .partitionBy(raw_df.master_id) \
    .orderBy(raw_df.created.desc())

# Create a dataframe with a row number for each partition to process
# raws grouped with their master from the most recent to the least
partionned_df = raw_df \
    .select(
        fields + [
            F.row_number().over(window_spec).alias('row_nb')
        ]
    ) \
    .orderBy(['master_id', 'row_nb'])

Это мой фрейм данных:

partionned_df.show()  
+------+---+---------------+---------+------------+-------------+------+
|master|raw|        created|last_name|mobile_phone|norm_civility|row_nb|
+------+---+---------------+---------+------------+-------------+------+
|     1|  3|02-05 11:22:...|     null|   641203047|         null|     1|
|     1|  5|02-05 11:22:...|     null|        null|     monsieur|     2|
|     1|  6|02-05 11:22:...|     null|        null|         null|     3|
|     1|  1|02-05 10:29:...|    name1|        null|           mr|     4|
|     3| 11|02-05 11:26:...|     null|        null|     monsieur|     1|
|     3|  4|02-05 10:30:...|     null|   630254175|         null|     2|
|     5| 15|02-05 11:35:...|     null|        null|         null|     1|
|     5| 13|02-05 11:35:...|     null|        null|         null|     2|
|     5| 14|02-05 11:33:...| name3   |        null|     monsieur|     3|
|     5|  7|02-05 11:22:...|     null|        null|         null|     4|
+---+------+---------------+---------+------------+-------------+------+ 

Что я хочу создатьновый фрейм данных только с разными мастерами и новыми столбцами после итерации по номеру строки каждого раздела и выполнения некоторых условий (например, если first_name не равно NULL и т. д.), и если условия не проверены в первом row_nb раздела, проверьтедругой и т. д., пока я не зациклю на каждом номере строки раздела.

Конечный кадр данных, который я хочу, выглядит примерно так:

+------+---------+------------+-------------+
|master|last_name|mobile_phone|norm_civility|
+------+---------+------------+-------------+
|     1|    name1|   641203047|    monsieur |
|     3|     null|   630254175|    monsieur |
|     5|    name3|        null|    monsieur |
+------+---------+------------+-------------+

Большое спасибо за вашу помощь заранее.

1 Ответ

0 голосов
/ 08 февраля 2019

Объедините этот фрейм данных. Идея состоит в том, чтобы использовать ignorenulls в функции first().

df = df.select('master','last_name','mobile_phone','norm_civility').groupBy(col('master')).agg(first(col('last_name'),ignorenulls = True).alias('last_name'),
                                   first(col('mobile_phone'),ignorenulls = True).alias('mobile_phone'),
                                   first(col('norm_civility'),ignorenulls = True).alias('norm_civility'))
df.show()
+------+---------+------------+-------------+
|master|last_name|mobile_phone|norm_civility|
+------+---------+------------+-------------+
|     5|    name3|        null|     monsieur|
|     1|    name1|   641203047|     monsieur|
|     3|     null|   630254175|     monsieur|
+------+---------+------------+-------------+

Подобный вопрос можно посмотреть здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...