Colmena: Cómo hacer una consulta de selección para la salida de una única clave principal con HiveQL?

Tengo el siguiente esquema del conjunto de datos que quiero transformar en una tabla que puede ser exportado a SQL. Estoy usando HIVE. De entrada como sigue

call_id,stat1,stat2,stat3
1,a,b,c,
2,x,y,z,
3,d,e,f,
1,j,k,l,

La tabla de salida debe tener call_id como clave principal, por lo que necesita ser único. El esquema de resultados debe ser

call_id,stat2,stat3,
1,b,c, or (1,k,l)
2,y,z,
3,e,f,

El problema es que cuando yo uso la palabra clave DISTINCT en el HIVE consulta, el DISTINCT se aplica a todas las columnas combinadas. Quiero aplicar las DISTINTAS operación sólo a la call_id. Algo en las líneas de

SELECT DISTINCT(call_id), stat2,stat3 from intable;

Sin embargo, esto no es válido en HIVE(no estoy muy versado en SQL tampoco).

El único legal de la consulta parece ser

SELECT DISTINCT call_id, stat2,stat3 from intable; 

Pero esto devuelve varias filas con el mismo call_id como las demás columnas son diferentes y la fila en la que el todo es distinto.

NOTA: no es aritmética relación entre a,b,c,x,y,z, etc. Por lo que cualquier truco de promedio o suma no es viable.

Alguna idea de cómo puedo hacer esto?

InformationsquelleAutor auny | 2013-02-22

2 Kommentare

  1. 2

    Una idea rápida,no la mejor, pero va a hacer el trabajo-

    colmena>create table temp1(int,b, cadena);

    colmena>insert sobrescribir la tabla temp1

    seleccione call_id,max(concat(stat1,’|’,stat2,’|’,stat3)) de intable grupo por call_id;

    colmena>insert sobrescribir la tabla intable

    seleccione un split(b,’|’)[0],split(b,’|’)[1],split(b,’|’)[2], de temp1;

  2. 1

    ,,Quiero aplicar las DISTINTAS operación sólo a la call_id»

    Pero, ¿cómo será entonces la Colmena saber que la fila a eliminar?

    Sin saber la cantidad de datos o tamaño de la estadística campos, la siguiente consulta puede el trabajo:

    select distinct i1.call_id, i1.stat2, i1.stat3 from (
      select call_id, MIN(concat(stat1, stat2, stat3)) as smin 
      from intable group by call_id
    ) i2 join intable i1 on i1.call_id = i2.call_id 
      AND concat(i1.stat1, i1.stat2, i1.stat3) = i2.smin;
    

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea