每次运行我在 SQL Impala 中使用前导函数时都会得到不同的结果
Posted
技术标签:
【中文标题】每次运行我在 SQL Impala 中使用前导函数时都会得到不同的结果【英文标题】:I get different results every time I run my which uses lead function in SQL Impala 【发布时间】:2020-11-23 21:49:05 【问题描述】:我有以下代码:
select *, lead(session_end_type) over (partition by user_id, session_id order by user_id, session_id, log_time) as next_session_end_type
from table_name;
但是,每次运行它似乎都会导致不同的结果。
是什么造成了这种差异?
提前致谢!
(我通过以下代码检查了代码输出不同的结果:
create table t1
select *, lead(session_end_type) over (partition by user_id, session_id order by user_id, session_id, log_time) as next_session_end_type
from table_name;
create table t2
select *, lead(session_end_type) over (partition by user_id, session_id order by user_id, session_id, log_time) as next_session_end_type
from table_name;
select count (*) from
(
select * from t1
union
select * from t2
) as t;
生成的行数与 t1 的行数和 t2 的行数不同;表示 t1 和 t2 的结果不同。)
【问题讨论】:
user_id, session_id, log_time
的组合在表中是否唯一?否则,您可能会得到稍微不同的订单,从而导致不同的潜在客户价值和不同的计数。
@ThorstenKettner 谢谢!我以为它们是独一无二的,但事实证明它们不是!没想到日志错误!
顺便说一句,不需要order by user_id, session_id
,那些列已经在partition by
中了
@dnoeth 哦,谢谢你让我知道 :)
【参考方案1】:
首先,不需要在order by
中重复partition by
列。您可以将其简化为:
lead(session_end_type) over (partition by user_id, session_id order by log_time) as next_session_end_type
其次,如果log_time
对于给定的user_id
/session_id
不是唯一的,则结果不稳定。请记住,SQL 表表示 无序 集合,因此如果排序键中存在关联,则没有“自然”顺序可以依赖。
您可以通过以下方式检查:
select user_id, session_id, log_time, count(*)
from table_name
group by user_id, session_id, log_time
having count(*) > 1
order by count(*) desc;
如果您确实有一列可以唯一标识每一行(或每个用户/用户会话行),则将其包含在 order by
中:
lead(session_end_type) over (partition by user_id, session_id
order by log_time, <make it stable column>) as next_session_end_type
)
【讨论】:
以上是关于每次运行我在 SQL Impala 中使用前导函数时都会得到不同的结果的主要内容,如果未能解决你的问题,请参考以下文章
在 Impala SQL 中获取时间戳行的差异,每次都会更新差异条件
是否可以使用 Python 将公用表表达式与 impala 一起使用?