我想知道如何在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/