结论:如果没用经过over()排序,默认会按照存储顺序排序,即在HDFS中的存储顺序排序
hive的排名函数
都是从1开始,生成数据项在分组中的排名。
-
row_number()。排名顺序增加不会重复;如1、2、3、4、... ...
-
RANK()。 排名相等会在名次中留下空位;如1、2、2、4、5、... ....
-
DENSE_RANK()。 排名相等会在名次中不会留下空位 ;如1、2、2、3、4、... ...
-- | row_number | rank | dense_rank |
---|---|---|---|
100 | 1 | 1 | 1 |
100 | 2 | 1 | 1 |
100 | 3 | 1 | 1 |
99 | 4 | 4 | 2 |
98 | 5 | 5 | 3 |
98 | 6 | 5 | 3 |
97 | 7 | 7 | 4 |
一般情况下row_number()函数和over连用,当存在一个或多个字段值相同(即数据重复)时,Hive会根据OVER
子句中定义的ORDER BY
子句里的字段进行排序。如果这些字段的值相同,Hive会继续比较后续字段,直到找到不同的字段或者所有指定的字段都比较完毕。
经过测试,如果没有排序,会按照默认存储顺序排序,也就是数据在HDFS中的hive表中的存储顺序排序
为了避免在处理数据重复时的不确定性,建议采取以下措施:
- 确保排序稳定性:在所有可能相同的排序字段之后,包含一个唯一的字段(如
id
),以确保每个分组内的排序是唯一确定的。 - 测试验证:在不同的数据集和Hive版本上测试你的窗口函数,确保它们按预期运行。