Bu amaçla basit bir UDF
yazabilirim. Yapı yolunuzda hive-exec
olması gerekir. Maven
durumunda
Örn:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>0.8.1</version>
</dependency>
Basit ham uygulama aşağıdaki gibi görünecektir:
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;
}
}
Sonraki, bir kavanoz inşa etmek ve kovan kabuğunda yüklemek:
hive> add jar /home/user/jar/myjar.jar;
hive> create temporary function subarraysum as 'com.myexample.SubArraySum';
Şimdi sahip olduğunuz dizinin toplamını hesaplamak için kullanabilirsiniz.
Örn: mytable içine
1 0,1,2,3,4
2 5,6,7,8,9
Yük it:
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';
sonra bazı sorguları yürütme
en Eğer içinde sekme ayrılmış sütunları olan bir giriş dosyası olduğunu varsayalım:
hive> select * from mytable;
1 [0,1,2,3,4]
2 [5,6,7,8,9]
aralığı m toplamı o, n, burada m = 1, n = 3
hive> select subarraysum(nums, 1,3) from mytable;
3
13
ya
hive> select sum(subarraysum(nums, 1,3)) from mytable;
16