0

SparkSQL文を作成する最良の方法は何ですか?このSparkSQL文を書く良い方法はありますか?

な書類上の任意の提案は:

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") 
           ) 

複数の "どこ" と "とき" の条件があります。よりクリーンな方法で書くことができますか?私はそのようなステートメントの100を持っています。

提案が参考になります。

答えて

1

私は同様の問題を抱えていた、ベストプラクティスは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) 

のために、たとえば、別のファイルまたはテーブルにこのルールを維持することです、その後、あなたは常に同じジェネリックは、rules_tableの変化とは独立して参加している、あなたが保存することができますさまざまなタスクのためのより多くのルール。

SparkSession.sqlに切り替えることができれば、ダイナミックSQLを作成し、テキストファイルからルールをSQL文字列に直接追加することができます。そのアプローチの問題は、開発部門の誰かがそのファイルを維持する必要があることです。

お客様よりも単純なルールがある場合、またはビジネスアナリストはルールを維持できます。

関連する問題