有没有更好的方法来编写这个 SparkSQL 语句?

Posted

技术标签:

【中文标题】有没有更好的方法来编写这个 SparkSQL 语句?【英文标题】:Is there a better way to write this SparkSQL statement? 【发布时间】:2017-05-12 05:33:46 【问题描述】:

编写 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 字符串而无需连接。这种方法的问题是开发部门的某个人必须维护该文件。

如果您有简单的 rules_table,则客户或业务分析师可以维护规则。

【讨论】:

以上是关于有没有更好的方法来编写这个 SparkSQL 语句?的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法来编写这个 BigQuery Sql?

子选择或连接?有没有更好的方法来编写这个 mysql 查询?

有没有更好、更干净的方法来编写这个本地存储数据

有没有更好的方法来编写这个处理比较两个不同列中的日期的 Oracle SQL?

有没有更好的方法在 python 中编写这个脚本

有没有更好的方法来进行这个查询?