Перебирайте номера строк раздела и сравнивайте значения для создания новых столбцов в 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|
+------+---------+------------+-------------+
Вы можете изучить подобный вопрос здесь.