我想知道如何在pyspark中执行以下sql代码?

在sql中,我在查询中创建了几个表。

我可以在pyspark中做到这一点,避免创建多个df吗? id可以不包含所有时间段,也可以包含所有时间段(我有5个时间段)。

create table mytable as
select p.id,
    case when t1.id is not null then 1 else 0 end as active_period_1,
    case when t2.id is not null then 1 else 0 end as active_period_2

from
(select id from table1) p
left join (select id from initial_table where buy_date>='2018-01-01' and
 buy_date<'2019-01-01') t1  on p.id= t1.id
left join (select id from initial_table where buy_date>='2017-01-01' and
 buy_date<'2018-01-01') t2  on p.id= t2.id

最佳答案

我认为您可以这样做,在过滤了正确的日期之后,向initial_table的左联接,选择列ID并创建填充有1的列active_period_1。对active_period_2执行相同的操作,最后用0填充两列的缺失值。

import pyspark.sql.functions as F

mytable = table1.select('id') \
                .join(initial_table.filter( (F.col(buy_date) >= F.to_date('2018-01-01'))
                                            & (F.col(buy_date) < F.to_date('2019-01-01')) )\
                                   .select('id')\
                                   .withColumn('active_period_1', F.lit(1)),
                       on = ['id'], how='left')\
                .join(initial_table.filter( (F.col(buy_date) >= F.to_date('2017-01-01'))
                                            & (F.col(buy_date) < F.to_date('2018-01-01')) )\
                                   .select('id')\
                                   .withColumn('active_period_2', F.lit(1)),
                       on = ['id'], how='left')\
                .fillna(0, subset=['active_period_1', 'active_period_2'])

关于python - 情况-在pyspark中检查多个表时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57359091/

10-12 14:27