Как передать динамические параметры для фильтрации функции в Pyspark?

#function #filter #pyspark #parameter-passing

#функция #Фильтр #pyspark #передача параметров

Вопрос:

Всем привет

У меня есть несколько запросов для разработки, и я подумал, что автоматизирую весь процесс с помощью функции, единственная проблема заключается в том, что вся структура практически одинакова, есть две вещи, которые меняются, первая — это фильтр, а вторая — создание столбца Group_Service

Например, для первого запроса у меня есть фильтр в столбце Service, где f.col(«Service»).like(«% New Bank ROME%») amp; столбец Group_Service создается следующим образом: .withColumn(‘group_service’, f.lit(«Римские службы»).приведение («строка»))

Для второго запроса у меня есть фильтр в столбце Service, где f.col(«Service»).like(«% New Bank BERLIN%») amp; столбец Group_Service создается следующим образом: .withColumn(‘group_service’, f.lit(«BERLIN Services»).cast(«строка»))

И в некоторых случаях фильтр и столбец Group_Service даже не существуют, поэтому запрос не будет включать эти два.

Вот мой код :

 def Query(df):
    df_1 = df.filter(df.customer.like('IT - ROME%') 
                amp; (f.col("day") > datetime(2017, 1, 1, 0, 0, 0))
        amp; (df.service.like('% New Bank ROME%')))
                .select("day" , "customer" , "availability" ,  f.month(f.col("day")).cast("string").alias("month"))
                .select("day" , "month" , "availability"  , "customer" ,  f.year(f.col("day")).cast("string").alias("year"))
                .withColumn('group_service', f.lit("ROME Services").cast("string"))
                .withColumn("year_month_s", f.when((f.col("month") == "10") | (f.col("month") == "11") | (f.col("month") == "12") , 
                f.concat(f.col("year"), f.lit(" "),f.col("month")))
                .otherwise( f.concat(f.col("year"), f.lit(" 0"),f.col("month")))
                ).distinct()
                .withColumn("customer", f.when(f.col('customer').like('IT - ROME%')
                , 'IT - ROME - BANK'))
  

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

Ответ №1:

Просто замените местоположение строками формата:

 def Query(df, location, service):
    df_1 = df.filter(df.customer.like(f'IT - {location}%') 
                     amp; (f.col("day") > datetime(2017, 1, 1, 0, 0, 0))
    if service:
        df_1 = df_1 amp; (df.service.like(f'% New Bank {location}%')))
                .select("day" , "customer" , "availability" ,  f.month(f.col("day")).cast("string").alias("month"))
                .select("day" , "month" , "availability"  , "customer" ,  f.year(f.col("day")).cast("string").alias("year"))
                .withColumn('group_service', f.lit(f"{location} Services").cast("string"))
                .withColumn("year_month_s", f.when((f.col("month") == "10") | (f.col("month") == "11") | (f.col("month") == "12") , 
                f.concat(f.col("year"), f.lit(" "),f.col("month")))
                .otherwise( f.concat(f.col("year"), f.lit(" 0"),f.col("month")))
                ).distinct()
                .withColumn("customer", f.when(f.col('customer').like(f'IT - {location}%')
                , f'IT - {location} - BANK'))
  

Комментарии:

1. Спасибо, но что, если в моем запросе нет условия для службы, он все равно будет работать? , еще раз спасибо