sql - Hive 相对于同一表中的其他数组列对数组列进行排序

标签 sql arrays hadoop hive hiveql

我在 hive 中有一个表,其中 2 列为 col1 array<int>col2 array<double> .输出如下图

col1                col2
[1,2,3,4,5]         [0.43,0.01,0.45,0.22,0.001]

我想按升序对 col2 进行排序,并且 col1 也应该相应地更改其索引,例如

col1                col2
[5,2,4,3,1]        [0.001,0.01,0.22,0.43,0.45]

最佳答案

分解两个数组,排序,然后再次聚合数组。在collect_list之前的子查询中使用sort对数组进行排序:

with your_data as(
select array(1,2,3,4,5) as col1,array(0.43,0.01,0.45,0.22,0.001)as col2
)

select original_col1,original_col2, collect_list(c1_x) as new_col1, collect_list(c2_x) as new_col2
from
(
select d.col1 as original_col1,d.col2 as original_col2, c1.x as c1_x, c2.x as c2_x, c1.i as c1_i  
 from your_data d
      lateral view posexplode(col1) c1 as i,x
      lateral view posexplode(col2) c2 as i,x
where c1.i=c2.i 
distribute by original_col1,original_col2
sort by c2_x
)s
group by original_col1,original_col2;

结果:

OK
original_col1   original_col2                   new_col1        new_col2
[1,2,3,4,5]     [0.43,0.01,0.45,0.22,0.001]     [5,2,4,1,3]     [0.001,0.01,0.22,0.43,0.45]
Time taken: 34.642 seconds, Fetched: 1 row(s)

编辑:同一脚本的简化版本,您可以不使用第二个 posexplode,使用按位置直接引用 d.col2[c1.i] as c2_x

with your_data as(
select array(1,2,3,4,5) as col1,array(0.43,0.01,0.45,0.22,0.001)as col2
)

select original_col1,original_col2, collect_list(c1_x) as new_col1, collect_list(c2_x) as new_col2
from
(
select d.col1 as original_col1,d.col2 as original_col2, c1.x as c1_x, d.col2[c1.i] as c2_x, c1.i as c1_i  
 from your_data d
      lateral view posexplode(col1) c1 as i,x
distribute by original_col1,original_col2
sort by c2_x
)s
group by original_col1,original_col2;

关于sql - Hive 相对于同一表中的其他数组列对数组列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57389401/

相关文章:

c++ - 如何创建一个结构体来存储和返回 float 组?

apache - 在 JSON 中获取 Hadoop 作业跟踪器指标

java - mapreduce,排序值

c# - 从 C# 上的 linq 获取 JSON 数组

mysql - 更新时参数索引超出范围(1 > 参数数量,为 0)

Javascript - 如何将数组列表转换为另一个键值数组列表?

hadoop - SalesForce 与 Hadoop 哪个更好?

sql - MySQL,需要一些关于我的比赛查询的性能建议

sql - 获取 'ORA-00907: missing right parenthesis' ,找不到错误

javascript - 如何在用户输入中写入数组的编号并获取该特定数组编号的信息?