Перебирайте номера строк раздела и сравнивайте значения для создания новых столбцов в PySpark SQL (spark 2.4.0)

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

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

Объедините этот dataframe. Идея состоит в том, чтобы использовать опцию 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|
+------+---------+------------+-------------+

Вы можете изучить подобный вопрос здесь.

Другие вопросы по тегам