Выполнение функций для нескольких столбцов в фреймах данных Pyspark - PullRequest
1 голос
/ 13 июля 2020

Мне нужно применить определенные функции к нескольким столбцам в фрейме данных Pyspark. Ниже мой код:

finaldf=df.withColumn('phone_number',regexp_replace("phone_number","[^0-9]",""))\
    .withColumn('account_id',regexp_replace("account_id","[^0-9]",""))\
    .withColumn('credit_card_limit',regexp_replace("credit_card_limit","[^0-9]",""))\
    .withColumn('credit_card_number',regexp_replace("credit_card_number","[^0-9]",""))\
    .withColumn('full_name',regexp_replace("full_name","[^a-zA-Z ]",""))\
    .withColumn('transaction_code',regexp_replace("transaction_code","[^a-zA-Z]",""))\
    .withColumn('shop',regexp_replace("shop","[^a-zA-Z ]",""))

finaldf=finaldf.filter(finaldf.account_id.isNotNull())\
    .filter(finaldf.phone_number.isNotNull())\
    .filter(finaldf.credit_card_number.isNotNull())\
    .filter(finaldf.credit_card_limit.isNotNull())\
    .filter(finaldf.transaction_code.isNotNull())\
    .filter(finaldf.amount.isNotNull())

Из кода вы можете видеть, что я написал избыточный код, который также увеличивает длину программы. Я также узнал, что искровой UDF неэффективен.

Есть ли способ оптимизировать этот код? Пожалуйста, дайте мне знать. Большое спасибо!

1 Ответ

1 голос
/ 13 июля 2020

Для multiple filters вы должны сделать это.

filter_cols= ['account_id','phone_number','credit_card_number','credit_card_limit','transaction_code','amount']
    
final_df.filter(' and '.join([x+' is not null' for x in  filter_cols]))
...