sumar array arrays hadoop aggregate hive aggregation

arrays - array - Sumar valores de tipos de matriz Hive



sumar foreach php (2)

Escribiría un UDF simple para este propósito. Necesita tener hive-exec en su ruta de compilación.
Ej. En caso de Maven :

<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>0.8.1</version> </dependency>

Una implementación simple simple se vería así:

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; } }

A continuación, construya un jar y cárguelo en Hive shell:

hive> add jar /home/user/jar/myjar.jar; hive> create temporary function subarraysum as ''com.myexample.SubArraySum'';

Ahora puede usarlo para calcular la suma de la matriz que tiene.

P.ej:

Supongamos que tiene un archivo de entrada con columnas separadas por tabuladores:

1 0,1,2,3,4 2 5,6,7,8,9

Cargarlo en mi tabla:

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'';

Ejecuta algunas consultas a continuación:

hive> select * from mytable; 1 [0,1,2,3,4] 2 [5,6,7,8,9]

Sumarlo en el rango m, n donde m = 1, n = 3

hive> select subarraysum(nums, 1,3) from mytable; 3 13

O

hive> select sum(subarraysum(nums, 1,3)) from mytable; 16

Hive tiene este tipo de Array bastante bueno que es muy útil en teoría, pero cuando se trata de la práctica, encontré muy poca información sobre cómo hacer cualquier tipo de opeartions con él. Almacenamos una serie de números en una columna de tipo de matriz y necesitamos SUMARlos en una consulta, preferiblemente de n-ésimo a m-ésimo elemento. ¿Es posible con HiveQL estándar o requiere un UDF o un mapeador / reductor de clientes?

Nota: estamos usando Hive 0.8.1 en entorno EMR.


La respuesta anterior está bastante bien explicada. Estoy publicando una implementación muy simple de la 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; } }

También publica la creación de la tabla y otras consultas.

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;

Mi archivo de entrada se vería como

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 ~ 25 ~ 8 ~ 15 ~ 7 ~ 19
7,3 ~ 55 ~ 78 ~ 5 ~ 7 ~ 9

He creado un jar de mi UDF, agrego el jar a colmena usando el siguiente comando

add jar file:///home/ak/Desktop/array.jar;

Luego creo una función temporal como se muestra

create temporary function getSum as ''com.ak.hive.udf.test.ArraySumUDF'';

Realice una consulta de muestra como se muestra a continuación,

select col1,getSum(col2,1,3) from table1;

Esto debería resolver la necesidad más básica. En caso de que, si esta no es la declaración del problema, responda nuevamente para que pueda ayudarlo nuevamente.