1. 要件の説明
要件: 指定された配列の最初の N 要素をインターセプトし、インターセプトされた部分配列を返します。
次の 3 種類の Hive 配列があるとします。
select array(1,2,3,4) -- [1,2,3,4]
select array(1,2,3,NULL) -- [1,2,3,null]
select split('123', space(0)) -- [1,2,3,]
さて、上記の配列の最初の 3 つの要素をインターセプトしたいのですが、どうすればよいでしょうか?
次のオプションを試すことができます
2. インデックスを使用する
方法 1: インデックスを使用して値を 1 つずつ取得し、新しい配列を収集する
with t as (select split('123', space(0)) as arr)
select array(arr[0],arr[1],arr[2]) from t -- [1,2,3]
-- 如果初始数组中包含NULL,使用下标取元素时,NULL将会被放在最前面的位置
with t as (select array(1,2,3,NULL) as arr)
select array(arr[1],arr[2],arr[3]) from t -- [1,2,3]
3.poseexplode()を使用する
方法 2:poseexplode() を使用して配列を分解し、pos<=N をフィルターして、新しい配列を収集します
with t as (select split('123', space(0)) as arr)
select collect_list(tmp.ele) from t
lateral view outer posexplode(arr) tmp as pos,ele
where pos < 3
group by arr -- [1,2,3]
4.文字列演算に変換する
方法 3: 最初に文字列に変換し、次に特定の長さをインターセプトして配列に変換します。
配列を文字列に変換した後の全長を計算する式は次のとおりです。
size(arr)+(size(arr)-1)
最初の N 個の要素を削除し、残りの要素を文字列に変換した後の配列の長さを計算する式は次のとおりです。
(size(arr)-N)*2
次に、インターセプトする必要がある最初の N 個の要素を文字列に変換する長さの計算式は次のようになります。
(size(arr)+(size(arr)-1))-(size(arr)-N)*2 = 2*N-1
with t as (select split('1,2,3,4', ',') as arr)
select split(substring(concat_ws(',',arr), 0, 2*3-1), ',')
from t -- [1,2,3]
with t as (select split('123', space(0)) as arr)
select split(substring(concat_ws(',',arr), 0, 2*3-1), ',')
from t -- [1,2,3]