Sql 前一个秩为零时如何分配秩(第2部分)
这是我先前问题的延伸。该解决方案在postgres环境中非常有效,但现在我需要复制到databricks环境spark sql 问题与之前相同,但现在正在尝试确定如何将此postgres查询转换为spark sql。基本上,如果数据中存在缺口,也就是说,按位置和geo3进行分组时,没有微观geo,则汇总分配金额。对于所有位置和zip3组,估算分配将等于1 这是postgres查询,非常有效:Sql 前一个秩为零时如何分配秩(第2部分),sql,apache-spark-sql,window-functions,databricks,gaps-and-islands,Sql,Apache Spark Sql,Window Functions,Databricks,Gaps And Islands,这是我先前问题的延伸。该解决方案在postgres环境中非常有效,但现在我需要复制到databricks环境spark sql 问题与之前相同,但现在正在尝试确定如何将此postgres查询转换为spark sql。基本上,如果数据中存在缺口,也就是说,按位置和geo3进行分组时,没有微观geo,则汇总分配金额。对于所有位置和zip3组,估算分配将等于1 这是postgres查询,非常有效: select location_code, geo3, distance_group, has_
select location_code, geo3, distance_group, has_micro_geo, imputed_allocation from
(
select ia.*,
(case when has_micro_geo > 0
then sum(allocation) over (partition by location_code, geo3, grp)
else 0
end) as imputed_allocation
from (select s.*,
count(*) filter (where has_micro_geo <> 0) over (partition by location_code, geo3 order by distance_group desc) as grp
from staging_groups s
) ia
)z
但它不能很好地转换,并在databricks中产生以下错误:
Error in SQL statement: ParseException:
mismatched input 'from' expecting <EOF>(line 1, pos 78)
== SQL ==
select location_code, geo3, distance_group, has_micro_geo, imputed_allocation from
------------------------------------------------------------------------------^^^
(
select ia.*,
(case when has_micro_geo > 0
then sum(allocation) over (partition by location_code, geo3, grp)
else 0
end) as imputed_allocation
from (select s.*,
count(*) filter (where has_micro_geo <> 0) over (partition by location_code, geo3 order by distance_group desc) as grp
from staging_groups s
) ia
)z
或者至少,如何只转换创建grp的内部查询的一部分,然后其他部分就可以工作了。我一直在尝试用其他东西替换这个过滤器,但是尝试并没有达到预期效果
select s.*,
count(*) filter (where has_micro_geo <> 0) over (partition by location_code, geo3 order by distance_group desc) as grp
from staging_groups s
这里有一个db摆弄当前设置为postgres的数据,但我需要在spark sql环境中再次运行它。我尝试过将其分解并创建不同的表,但我的小组并没有按预期工作
select s.*,
count(*) filter (where has_micro_geo <> 0) over (partition by location_code, geo3 order by distance_group desc) as grp
from staging_groups s
以下是一幅图像,可以更好地显示输出:
您需要重写此子查询:
select s.*,
count(*) filter (where has_micro_geo <> 0) over (partition by location_code, geo3 order by distance_group desc) as grp
from staging_groups s
我认为查询的其余部分在Spark SQL中应该可以正常运行。因为micro\u geo已经是一个0/1标志,您可以将countfilter重新连接到它
sum(has_micro_geo)
over (partition by location_code, geo3
order by distance_group desc
rows unbounded preceding) as grp
添加行无界前置,以避免默认范围无界前置,这可能会降低性能
顺便说一句,我已经在对戈登对你之前问题的解决方案的评论中写道:-