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 Comentarios

  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;
    

Dejar respuesta

Please enter your comment!
Please enter your name here