如何为缺少的数据组合添加行并将相应的字段估算为 0
Posted
技术标签:
【中文标题】如何为缺少的数据组合添加行并将相应的字段估算为 0【英文标题】:How to add rows for missing combination of data and impute corresponding fields with 0 【发布时间】:2018-11-02 22:14:54 【问题描述】:我有域和月份的组合以及相应月份的总订单。我想用 0 值估算缺失的组合。可以在 Pyspark 中使用的最便宜的聚合命令是什么?
我有以下输入表:
domain month year total_orders
google.com 01 2017 20
yahoo.com 02 2017 30
google.com 03 2017 30
yahoo.com 03 2017 40
a.com 04 2017 50
a.com 05 2017 50
a.com 06 2017 50
预期输出:
domain month year total_orders
google.com 01 2017 20
yahoo.com 02 2017 30
google.com 03 2017 30
yahoo.com 03 2017 40
a.com 04 2017 50
a.com 05 2017 50
a.com 06 2017 50
google.com 02 2017 0
google.com 04 2017 0
yahoo.com 04 2017 0
google.com 05 2017 0
yahoo.com 05 2017 0
google.com 06 2017 0
yahoo.com 06 2017 0
Here 预期的输出顺序并不重要。
【问题讨论】:
到目前为止,您在 Pyspark 中尝试过什么? 【参考方案1】:最简单的方法是结合每个域的所有月份和年份:
select my.year, my.month, d.domain, coalesce(t.total_orders, 0) as total_orders
from (select distinct month, year from input) my cross join
(select distinct domain from input) d left join
t
on t.month = my.month and t.year = my.year and t.domain = d.domain;
注意:这假设每个年/月组合在数据中的某处至少出现一次。
获取某个范围内的值很麻烦,因为您已将日期拆分为多个列。让我假设年份都是一样的,就像你的例子一样:
select my.year, my.month, d.domain, coalesce(t.total_orders, 0) as total_orders
from (select distinct month, year from input) my join
(select domain, min(month) as min_month, max(month) as max_month
from input
) d
on my.month >= d.min_month and my.month <= d.max_month left join
t
on t.month = my.month and t.year = my.year and t.domain = d.domain
【讨论】:
谢谢戈登。我将弄清楚如何操作这些查询以与 Spark 一起使用以上是关于如何为缺少的数据组合添加行并将相应的字段估算为 0的主要内容,如果未能解决你的问题,请参考以下文章