gpt4 book ai didi

arrays - Hive 数组类型的求和值

转载 作者:可可西里 更新时间:2023-11-01 14:16:11 26 4
gpt4 key购买 nike

Hive 有一个非常好的 Array 类型,它在理论上非常有用,但在实践中,我发现关于如何使用它进行任何类型的操作的信息很少。我们将一系列数字存储在数组类型的列中,并且需要在查询中对它们求和,最好是从第 n 个到第 m 个元素。是否可以使用标准 HiveQL 或是否需要 UDF 或客户映射器/缩减器?

注意:我们在 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;
}
}

接下来,构建一个 jar 并将其加载到 Hive shell 中:

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

将其加载到我的表中:

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

关于arrays - Hive 数组类型的求和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12380955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com