2012-09-12 19 views
6

Hive tiene este tipo de matriz bastante agradable que es muy útil en teoría, pero cuando se trata de práctica encontré muy poca información sobre cómo hacer cualquier tipo de opeartions con ella. 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?Sumando valores de los tipos de matriz Hive

Nota: estamos usando Hive 0.8.1 en entorno EMR.

Respuesta

9

Escribo un simple UDF para este propósito. Necesita tener hive-exec en su ruta de compilación.
por ejemplo, en caso de Maven:

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

Una simple aplicación en bruto 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, construir un frasco y cargarlo en la colmena de la 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.

Ej:

Vamos a suponer que usted tiene un archivo de entrada que tiene columnas separadas por tabuladores en ella:

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

cargarlo en mitabla:

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

Ejecutar algunas consultas a continuación:

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

Sum que en el rango de 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 
1

la respuesta anterior está bastante bien explicados. 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 publicando 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

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 th e frasco para la colmena con el siguiente comando

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

Entonces creo función temporal como se muestra

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

Realice una consulta de ejemplo como abajo,

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

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

Cuestiones relacionadas