将sql语句转换为pyspark

1tu0hz3e  于 2021-07-12  发布在  Spark
关注(0)|答案(2)|浏览(398)

我已经创建了一个sql代码,我想把它转换成pyspark代码。除了一件事,它是有效的。但如何才能最好地插入求和函数。

SELECT r_date, abc_code, sum(case when kpi_id=1234 then value else null end) as XXX, 
       sum(case when kpi_id=5678 then value else null end) as YYY from rate 
WHERE abc_code = 'AS55' AND org_id = '12-3' 
GROUP BY r_date, abc_code 
ORDER BY r_date DESC, abc_code;

Pypark代码

rate_df = rate_df.select(
    'org_id',
    'abc_code',
    'value',
    'r_date',
    expr("case when kpi_id == '1234' then value else ' ' end").alias('XXX'),
    expr("case when kpi_id == '5678' then value else ' ' end").alias('YYY')
    ) \
    .where((F.col('abc_code') == 'AS55') &
           (F.col('organisation_id') == '12-3'))

如何在pyspark中插入sum函数以获得一行中的值。

qxgroojn

qxgroojn1#

把钥匙放好 where 首先,然后 groupBy ,最后放入 agg :

import pyspark.sql.functions as F

rate_df2 = rate_df.where(
    (F.col('abc_code') == 'AS55') &
    (F.col('organisation_id') == '12-3')
).groupBy(
    'r_date', 'abc_code'
).agg(
    F.sum(F.when(F.col('kpi_id') == 1234, F.col('value'))).alias('XXX'),
    F.sum(F.when(F.col('kpi_id') == 5678, F.col('value'))).alias('YYY')
).orderBy(
    F.desc('r_date'), F.col('abc_code')
)
dgtucam1

dgtucam12#

我实现了以下代码:

rate_df = rate_df.select(
    F.col('creation_date').alias('r_date'),
    'organisation_id',
    'b_employee',
    'abc_code',
    'kpi_date',
    'kpi_id',
    'value'
    )
nh_rate_df = rate_df.where(
        (F.col('abc_code') == 'AS55') &
        (F.col('organisation_id') == '12-3')
     ).groupBy(
        'organisation_id', 'r_date', 'b_employee', 'kpi_date', 'abc_code'
    ).agg(
        F.sum(F.when(F.col('kpi_id') == 1234, F.col('value'))).alias('xxx'),
        F.sum(F.when(F.col('kpi_id') == 5678, F.col('value'))).alias('YYY'),
    ).orderBy(
        F.desc('kpi_date'), F.col('abc_code')
    )
nh_rate_df = nh_rate_df.join(s_function_df, 'abc_code', 'left')
nh_rate_df = nh_rate_df.join(hst_df, 'organisation_id', 'left')

我得到的结果不是所有匹配行的总和。
r\u datekpi\u dateorganization\u id\u codeb\u emplyyyyy2020-12-022020-11-01 00:0012-3as55a1.0000null2020-12-022020-11-01 00:0012-3as55null1.00002020-11-022020-10-01 00:0012-3as55anull1.00002020-11-022020-10-01 00:00:0012-3as55null1.0000null2020-10-022020-09-01 00:0012-3as55a20202.0000a2020-10-022020-09-0100:00:0012-3as55null1.00002002-09-222020-08-01 00:00:0012-3as55null1.00001.00002002-09-222020-08-01 00:00:0012-3as55anullnull
虽然我有同样的约会。会是因为加入吗?
如果我运行sql代码,就会得到这个结果
r\u datekpi\u dateorganization\u id\u codeb\u emplyyyyy2020-12-022020-11-01 00:0012-3as55a1.00002.00002020-11-022020-10-01 00:0012-3as55a1.00002.00002020-10-022020-09-01 00:00:0012-3as55a2.00001.00002020-09-2220200-08-01 00:00:0012-3as55null2.00001.0000

相关问题