我有一张像下面这样的table
id week count
A100 201008 2
A100 201009 9
A100 201010 16
A100 201011 23
A100 201012 30
A100 201013 36
A100 201015 43
A100 201017 50
A100 201018 57
A100 201019 63
A100 201023 70
A100 201024 82
A100 201025 88
A100 201026 95
A100 201027 102
在这里,我们可以看到,以下几周是失踪的:
第一个201014不见了
第二个201016不见了
第三周失踪201020201021201022
我的要求是,每当我们缺少值时,我们需要显示前一周的计数。
在这种情况下,输出应为:
id week count
A100 201008 2
A100 201009 9
A100 201010 16
A100 201011 23
A100 201012 30
A100 201013 36
A100 201014 36
A100 201015 43
A100 201016 43
A100 201017 50
A100 201018 57
A100 201019 63
A100 201020 63
A100 201021 63
A100 201022 63
A100 201023 70
A100 201024 82
A100 201025 88
A100 201026 95
A100 201027 102
如何使用hive/pyspark实现此要求?
2条答案
按热度按时间tyky79it1#
Pypark溶液
样本数据
1) 其基本思想是创建一个具有
cross join
.2) 此后,
left join
将原始DataframeMap到这些组合有助于识别缺少的值。3) 然后,结合使用窗口函数,
sum
->分配组和max
->在分组后填写缺失值。具有与上述相同逻辑的配置单元查询(假设可以创建包含所有周的表)
nnt7mjpx2#
尽管这个答案是正确的
Scala
,python版本看起来几乎一样&可以很容易地转换。第一步:
查找之前缺少周值的行。
样本输入:
为了找到它,我们可以用
.lead()
功能开启week
. 并计算出leadWeek
以及week
. 差异不应大于1,如果是这样,则前面缺少行。第二步:
如果差异大于等于1:创建并添加n行(
InputWithDiff
,检查下面的case类)diff
和增量week
相应地估价。返回新创建的行以及原始行。如果diff为0,则不需要额外计算。按原样返回原始行。
转换
diffDF
以便于计算。最终输出: