【发布时间】:2021-10-15 00:48:25
【问题描述】:
我有以下两个数据帧,并希望通过连接两个两个输入数据帧来填充最终数据帧。
df1 即 table1
id | code | name | location | val | date
1000 | 1 | 'A' | 'AABB' | 1 | 2021-01-01
1000 | 2 | 'B' | 'BBCC' | 3 | 2021-01-01
1000 | 3 | 'C' | 'CCDD' | 4 | 2021-01-01
1000 | 4 | 'D' | 'DDEE' | 1 | 2021-01-01
2000 | 1 | 'E' | 'EEFF' | 5 | 2021-03-01
2000 | 2 | 'F' | 'XXYY' | 4 | 2021-03-01
2000 | 3 | 'G' | 'YYZZ' | 2 | 2021-03-01
2000 | 4 | 'H' | 'ZZAA' | 1 | 2021-03-01
2000 | 4 | 'I' | 'IIII' | 1 | 2021-03-01
df1.createOrReplaceTempView('df1')
df2 即 table2
id | city | dist | state | count | tot_sum | date
1000 | null | null | null | null | null | 2021-01-01
2000 | null | null | null | null | null | 2021-03-01
df2.createOrReplaceTempView('df2')
df3 即 table3
id | city | dist | state | count | tot_sum | date
1000 | 'AABB' | 'BBCC' | 'CCDD' | 1 | 9 | 2021-01-01
2000 | 'EEFF' | 'XXYY' | 'YYZZ' | 2 | 13 | 2021-03-01
逻辑:
当代码 =1 时,将位置视为城市
当代码 =2 时,将位置视为 dist
当代码 =3 时,将位置视为状态
当代码 =4 时,计算该 id 的代码的记录总数,即在 id 1000 的情况下,我们只有一条代码为 4 的记录,在 id 2000 的情况下,我们有 2 条记录
对于该 id 的所有 val 的代码 4 总和是 tot_sum 即对于 id 1000 它将是 1+3+4+1=9,对于 id 2000 它将是 5+4+2+1+ 1=13
尝试以下类似的方法,但没有成功
select d2.id as id,
d2.date as date,
CASE WHEN d1.code=1 then d1.location else null end as city,
CASE WHEN d1.code=2 then d1.location else null end as dist,
CASE WHEN d1.code=3 then d1.location else null end as state
FROM df1 d1 join df2 d2 on d1.id=d2.id
select d2.id,
d2.date
CASE WHEN d1.code=1 then state=d1.location,
CASE WHEN d1.code=2 then dist=d1.location,
CASE WHEN d1.code=3 then CityName=d1.location
FROM df1 d1 join df2 d2 on d1.id=d2.id
有什么建议吗?
注意:寻找 SQL 查询(考虑两个输入表)/Pyspark 数据帧/Pandas 数据帧
DF1:
【问题讨论】:
标签: sql pandas dataframe apache-spark pyspark