#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. Спасибо, но что, если в моем запросе нет условия для службы, он все равно будет работать? , еще раз спасибо