3

I have a table in hive , with 2 columns as col1 array<int> and col2 array<double>. Output is as shown below

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

I want to sort this col2 in ascending order and col1 should also change its index accordingly for e.g.

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

1 Answer 1

2

Explode both arrays, sort, then aggregate arrays again. Use sort in the subquery before collect_list to sort the array:

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;

Result:

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)

Edit: Simplified version of the same script, you can do without second posexplode, use direct reference by position 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;
Sign up to request clarification or add additional context in comments.

2 Comments

Working as expected, Thank you much @leftjoin, can you please help me on this question too if possible stackoverflow.com/questions/57310000/…
@nilesh1212. I would if I could, but I can't so I won't. Upvoted, interesting, maybe someone else will help

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.