Hive有這個相當不錯的數組類型,理論上非常有用,但是當涉及到實踐時,我發現關於如何使用它進行任何類型的操作的信息非常少。 我們在數組類型列中存儲一系列數字,並且需要在查詢中對它們進行求和,最好是從第n個元素到第m個元素。標準HiveQL有可能,還是需要UDF或客戶映射器/縮減器?Hive數組類型的求和值
注意:我們在EMR環境中使用Hive 0.8.1。
Hive有這個相當不錯的數組類型,理論上非常有用,但是當涉及到實踐時,我發現關於如何使用它進行任何類型的操作的信息非常少。 我們在數組類型列中存儲一系列數字,並且需要在查詢中對它們進行求和,最好是從第n個元素到第m個元素。標準HiveQL有可能,還是需要UDF或客戶映射器/縮減器?Hive數組類型的求和值
注意:我們在EMR環境中使用Hive 0.8.1。
我會爲此寫一個簡單的UDF
。您需要在構建路徑中有hive-exec
。
例如在Maven
情況:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>0.8.1</version>
</dependency>
一個簡單的原始的實現應該是這樣的:
package com.myexample;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.IntWritable;
public class SubArraySum extends UDF {
public IntWritable evaluate(ArrayList<Integer> list,
IntWritable from, IntWritable to) {
IntWritable result = new IntWritable(-1);
if (list == null || list.size() < 1) {
return result;
}
int m = from.get();
int n = to.get();
//m: inclusive, n:exclusive
List<Integer> subList = list.subList(m, n);
int sum = 0;
for (Integer i : subList) {
sum += i;
}
result.set(sum);
return result;
}
}
接下來,建立一個罐子,在蜂巢外殼加載:
hive> add jar /home/user/jar/myjar.jar;
hive> create temporary function subarraysum as 'com.myexample.SubArraySum';
現在你可以用它來計算你所擁有的數組的總和。
如:
讓我們假設你有其中具有製表符分隔欄輸入文件:
1 0,1,2,3,4
2 5,6,7,8,9
其裝載到mytable中:
hive> create external table mytable (
id int,
nums array<int>
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/user/hadoopuser/hive/input';
執行一些查詢,那麼:
hive> select * from mytable;
1 [0,1,2,3,4]
2 [5,6,7,8,9]
薩姆它在範圍M,N,其中m = 1時,n = 3的
hive> select subarraysum(nums, 1,3) from mytable;
3
13
或者
hive> select sum(subarraysum(nums, 1,3)) from mytable;
16
上述答案是相當好說明。我發佈了UDF的一個非常簡單的實現。
package com.ak.hive.udf.test;
import java.util.ArrayList;
import org.apache.hadoop.hive.ql.exec.UDF;
public final class ArraySumUDF extends UDF {
public int evaluate(ArrayList<Integer>arrayOfIntegers,int startIndex,int endIndex) {
// add code to handle all index problem
int sum=0;
int count=startIndex-1;
for(;count<endIndex;count++){
sum+=arrayOfIntegers.get(count);
}
return sum;
}
}
還張貼表創建和其他查詢。
create table table1 (col1 int,col2 array<int>)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '~' STORED AS TEXTFILE;
load data local inpath '/home/ak/Desktop/hivedata' into table table1;
我的輸入文件是像
1,3〜5〜8〜5〜7〜9
2,93〜5〜8〜5〜7〜29
3,3 〜95〜8〜5〜27〜9
4,3〜5〜58〜15〜7〜9
5,3〜25〜8〜55〜7〜49
6,3〜 15〜7〜19
7,3〜55〜78〜5〜7〜9
我創建了一個我的UDF的jar, È罐子蜂巢使用以下命令
add jar file:///home/ak/Desktop/array.jar;
然後,我創建臨時函數如圖
create temporary function getSum as 'com.ak.hive.udf.test.ArraySumUDF';
執行如下一個示例查詢,
select col1,getSum(col2,1,3) from table1;
這應該解決的非常基本的需要。如果這不是問題陳述的問題,請回復,以便我可以再次提供幫助。