От многих столбцов pyspark (с определенным условием) до одного столбца со всеми условиями вместе. PYSPARK - PullRequest
0 голосов
/ 12 июня 2019

У меня есть один список Python с несколькими столбцами PySpark, который содержит определенные условия.Я хочу иметь только один столбец, который суммирует все условия, которые у меня есть в списке столбцов.

Я пытался использовать операцию sum (), чтобы объединить все столбцы, но она не сработала (явно).Кроме того, я проверял документацию https://spark.apache.org/docs/2.2.0/api/python/pyspark.sql.html Но мне казалось, что ничего не работает.
Я делаю что-то вроде этого:

my_condition_list = [col (c) .isNotNull () для c в some_of_my_sdf_columns]

, который возвращает список различных столбцов Pyspark, я хочу только один со всеми включенными условиями в сочетании с |оператор, поэтому я могу использовать его в предложении .filter () или .when ().

СПАСИБО

1 Ответ

0 голосов
/ 12 июня 2019

PySpark не будет принимать список по состоянию where/filter. Он принимает либо string, либо condition.

То, как вы пытались, не сработало, вам нужно настроить некоторые вещи, чтобы поработать над ним. Ниже приведены 2 подхода для этого -

data = [(("ID1", 3, None)), (("ID2", 4, 12)), (("ID3", None, 3))]
df = spark.createDataFrame(data, ["ID", "colA", "colB"])
df.show()

from pyspark.sql import functions as F 

путь - 1

#below change df_name if you have any other name
df_name = "df"
my_condition_list = ["%s['%s'].isNotNull()"%(df_name, c) for c in df.columns]

print (my_condition_list[0])
"df['ID'].isNotNull()"

print (" & ".join(my_condition_list))
"df['ID'].isNotNull() & df['colA'].isNotNull() & df['colB'].isNotNull()"

print (eval(" & ".join(my_condition_list)))
Column<b'(((ID IS NOT NULL) AND (colA IS NOT NULL)) AND (colB IS NOT NULL))'>

df.filter(eval(" & ".join(my_condition_list))).show()
+---+----+----+
| ID|colA|colB|
+---+----+----+
|ID2|   4|  12|
+---+----+----+

df.filter(eval(" | ".join(my_condition_list))).show()
+---+----+----+
| ID|colA|colB|
+---+----+----+
|ID1|   3|null|
|ID2|   4|  12|
|ID3|null|   3|
+---+----+----+

путь - 2

my_condition_list = ["%s is not null"%c for c in df.columns]
print (my_condition_list[0])
'ID is not null'

print (" and ".join(my_condition_list))
'ID is not null and colA is not null and colB is not null'

df.filter(" and ".join(my_condition_list)).show()
+---+----+----+
| ID|colA|colB|
+---+----+----+
|ID2|   4|  12|
+---+----+----+

df.filter(" or ".join(my_condition_list)).show()
+---+----+----+
| ID|colA|colB|
+---+----+----+
|ID1|   3|null|
|ID2|   4|  12|
|ID3|null|   3|
+---+----+----+

Предпочтительный способ - путь-2

...