Yo uso la función split para crear una matriz en la Colmena, ¿cómo puedo obtener los primeros n elementos de la matriz, y quiero ir a través de la sub-matriz de

ejemplo de código

select col1 from table
where split(col2, ',')[0:5] 

‘[0:5]’ve le gusta python estilo, pero no funciona aquí.

  • ¿qué es exactamente lo que usted piensa hacer con los n elementos? desea que cada elemento en una fila separada o separado de la columna?
  • Quiero en una fila separada, y quiero estadística de la relación de valor en los primeros n elementos. Supongamos que tengo de formato de fila como «abc#1,def#2,hij#3″… ahora, quiero saber ¿cuál es la relación de #1 o #2 en los tres primeros elementos.
  • publicado como respuesta..
  • Ovbiously, no estás calificado para seleccionar la respuesta correcta a esta pregunta.
InformationsquelleAutor Carlos Lin | 2014-08-18

2 Comentarios

  1. -1

    Este es complicado.

    Primero tomar el brickhouse frasco de aquí

    A continuación, añadir a la Colmena : add jar /path/to/jars/brickhouse-0.7.0-SNAPSHOT.jar;

    Ahora crear las dos funciones que se utilizan :

    CREATE TEMPORARY FUNCTION array_index AS 'brickhouse.udf.collect.ArrayIndexUDF';

    CREATE TEMPORARY FUNCTION numeric_range AS 'brickhouse.udf.collect.NumericRange';

    La consulta será :

    select a,
    n as array_index,
    array_index(split(a,','),n) as value_from_Array
    from ( select "abc#1,def#2,hij#3" a from dual union all
    select "abc#1,def#2,hij#3,zzz#4" a from dual) t1
    lateral view numeric_range( length(a)-length(regexp_replace(a,',',''))+1 ) n1 as n

    Explicó :

    select "abc#1,def#2,hij#3" a from dual union all
    select "abc#1,def#2,hij#3,zzz#4" a from dual

    Es que la selección de algunos de los datos de prueba, en su caso reemplazar esto con el nombre de la tabla.

    lateral view numeric_range( length(a)-length(regexp_replace(a,',',''))+1 ) n1 as n

    numeric_range es un UDTF que devuelve una tabla para un rango dado, en este caso, pedí un rango entre 0 (valor predeterminado) y el número de elementos en la cadena (calculado como el número de comas + 1)

    De esta manera, cada fila se multiplica por el número de elementos en la columna dada.

    array_index(split(a,','),n)

    Esto es exactamente como el uso de split(a,',')[n] pero colmena no lo admite.

    Así, obtenemos el n-ésimo elemento por cada duplicado de la fila de la primera cuerda, lo que resulta en :

    abc#1,def#2,hij#3,zzz#4 0 abc#1
    abc#1,def#2,hij#3,zzz#4 1 def#2
    abc#1,def#2,hij#3,zzz#4 2 hij#3
    abc#1,def#2,hij#3,zzz#4 3 zzz#4
    abc#1,def#2,hij#3 0 abc#1
    abc#1,def#2,hij#3 1 def#2
    abc#1,def#2,hij#3 2 hij#3

    Si usted realmente desea un número específico de elementos (por ejemplo, 5), a continuación, sólo tiene que utilizar :

    lateral view numeric_range(5 ) n1 as n

  2. 2

    Esta es una manera mucho más sencilla de hacerlo. Hay una UDF aquí llamado TruncateArrayUDF.javaque puede hacer lo que están pidiendo. Solo clon de la repo desde la página principal y construir el frasco con Maven.

    Datos De Ejemplo:

    |       col1         |
    ----------------------
      1,2,3,4,5,6,7
      11,12,13,14,15,16,17
    

    Consulta:

    add jar /complete/path/to/jar/brickhouse-0.7.0-SNAPSHOT.jar;
    create temporary function trunc as 'brickhouse.udf.collect.TruncateArrayUDF';
    
    select pos
          ,newcol
    from (
          select trunc(split(col1, '\,'), 5) as p
          from table
         ) x
    lateral view posexplode(p) explodetable as pos, newcol
    

    De salida:

      pos  |  newcol  |
    -------------------
      0         1
      1         2
      2         3
      3         4
      4         5
      0         11
      1         12
      2         13
      3         14
      4         15
    
    • Sí, lo Dimamesh no va a funcionar técnicamente, pero ‘truncate_array’ fue hecha específicamente para este caso de uso. Brickhouse está disponible en github.com/klout/brickhouse .
    • Gracias por todas las UDFs. Yo los uso todos los días. grandes cosas.
    • Me puedes dar una solución sin usar Udf?
    • Buena solución, no era consciente de la TruncateArray UDF. También posexplode sólo está disponible desde la colmena de 0,13.
    • La pregunta no es ‘¿Cómo obtener los primeros n elementos en una matriz en la Colmena sin el uso de una UDF», es tan solo ‘¿Cómo obtener los primeros n elementos en una matriz en la Colmena’

Dejar respuesta

Please enter your comment!
Please enter your name here