每次运行我在 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 中获取时间戳行的差异,每次都会更新差异条件

告诉 Impala 忽略错误并继续

是否可以使用 Python 将公用表表达式与 impala 一起使用?

为 impala 查询打开屏幕

“order by”的 Hive、Impala、HBASE 和 SQL 比较

impala shell 命令中的 MEM_LIMIT