0

Was sind die besten Möglichkeiten zum Schreiben von SparkSQL-Anweisungen?Gibt es eine bessere Möglichkeit, diese SparkSQL-Anweisung zu schreiben?

Irgendwelche Vorschläge auf solche Aussagen:

import pyspark.sql.functions as psf 

df_final = df_01\ 
      .select(df_01['*'], 
        psf.when(df_01.record_two>\ 
          df_01.record_three, 
          df_01.record_two) 
         .otherwise(df_01.record_three)\ 
         .alias("some_new_alias"))\ 
      .where("some_field > 1000")\ 
      .where((df_01.record_one.isin(df_red01.record_one)==False) |\ 
        (df_01.record_one.isin(df_blue01.record_one)==False) |\ 
        (df_01.record_one.isin(df_violet01.record_one)==False) |\ 
        (df_01.record_one.isin(df_green01.record_one)==False) |\ 
        (df_01.record_one.isin(df_black01.record_one)==False) |\ 
        (df_01.record_one.isin(df_white01.record_one)==False) |\ 
        (df_01.record_one.isin(df_red02.record_one)==False) |\ 
        (df_01.record_one.isin(df_blue02.record_one)==False) |\ 
        (df_01.record_one.isin(df_violet02.record_one)==False) |\ 
        (df_01.record_one.isin(df_green02.record_one)==False) |\ 
        (df_01.record_one.isin(df_black02.record_one)==False) |\ 
        (df_01.record_one.isin(df_white02.record_one)==False) |\ 
        (df_01.record_one.isin(df_blue03.record_one)==False) |\ 
        (df_01.record_one.isin(df_violet03.record_one)==False) |\ 
        (df_01.record_one.isin(df_green03.record_one)==False) |\ 
        (df_01.record_one.isin(df_black03.record_one)==False) |\ 
        (df_01.record_one.isin(df_violet04.record_one)==False) |\ 
        (df_01.record_one.isin(df_green04.record_one)==False) |\ 
        (df_01.record_one.isin(df_violet04.record_one)==False))\ 
      .select("record_one", "some_new_alias") 


df_another_test_frame = df_jibber01\ 
         .select(df_jibber01.field01, 
           df_jibber01.field02, 
           df_jibber01.field03, 
           df_jibber01.field04, 
           df_jibber01.field05, 
           df_jibber01.field06, 
           df_jibber01.field07, 
           df_jibber01.field08, 
           df_jibber01.field09, 
           psf.when(df_jibber01.field04 <= 100, 
              psf.round(2000*df_jibber01.field10/59, 10))\ 
            .when(df_jibber01.field05 >= 1, 
              psf.round(2000*df_jibber01.field10/59, 10))          
            .when(df_jibber01.field06 >= 2, 
              psf.round(2000*df_jibber01.field10/59, 10))          
            .when(df_jibber01.field04 <= 3, 
              psf.round(20*df_jibber01.field10/59, 10))          
            .when(df_jibber01.field05 >= 4, 
              psf.round(20*df_jibber01.field10/59, 10))  
            .when(df_jibber01.field06 >= 5, 
              psf.round(20*df_jibber01.field10/59, 10)) 
            .when(df_jibber01.field04 <= 6, 
              psf.round(9999*df_jibber01.field10/59, 10)) 
            .when(df_jibber01.field05 >= 7, 
              psf.round(9999*df_jibber01.field10/59, 10)) 
            .when(df_jibber01.field06 >= 8, 
              psf.round(9999*df_jibber01.field10/59, 10))          
            .otherwise(psf.round(9999*df_jibber01.field10/59, 10))\ 
            .alias("field11") 
           ) 

Es gibt mehrere "wo" und "wann" Bedingungen. Gibt es eine sauberere Art zu schreiben? Ich habe 100 solcher Aussagen.

Jeder Vorschlag wäre hilfreich.

Antwort

1

Ich hatte ähnliches Problem, Best Practice ist es, diese Regeln in separater Datei oder Tabelle für df_another_test_frame

rules_table(ruled_id int ,field04_from int,field04_to int ,field05_from int 
,field05_to int ,field06_from int,field06_to int,ponder_for_field_10 decimal) 

zum Beispiel zu halten und dann haben Sie immer generic gleiche verbinden mit rules_table, unabhängig von Änderungen und Sie können speichern mehr Regeln für verschiedene Aufgaben.

Wenn Sie zu SparkSession.sql wechseln können Sie dynamische SQL und fügen Sie Regeln aus Textdatei direkt zu SQL-Zeichenfolge ohne Join. Problem bei diesem Ansatz ist, dass jemand aus der Entwicklungsabteilung diese Datei verwalten muss.

Wenn Sie eine einfache rules_table haben, können Kunden oder ein Business Analyst Regeln verwalten.

Verwandte Themen