Estoy usando Amazon Elastic MapReduce y tengo una colmena tabla creada en base a una serie de archivos de registro almacenados en Amazon S3 y dividida en carpetas por día así:

  • de datos/día=2011-09-01/log_file.tsv
  • de datos/día=2011-09-02/log_file.tsv

Actualmente estoy tratando de crear una tabla adicional que filtra algunas de las actividades no deseadas en estos archivos de registro pero no puedo averiguar cómo hacer esto y seguir recibiendo errores tales como:

FAILED: Error in semantic analysis: need to specify partition columns because the destination table is partitioned.

Si mi primera tabla en la instrucción create ve algo como esto:

CREATE EXTERNAL TABLE IF NOT EXISTS table1 (
... fields ...
)
PARTITIONED BY ( DAY STRING )
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION 's3://bucketname/data/';

Que la primera tabla en la que trabaja muy bien y he sido capaz de consulta de él sin problemas.

Entonces, ¿cómo debo crear una nueva tabla en la que se comparte la estructura de la anterior, sino simplemente en los filtros de datos? Esto no parece funcionar.

CREATE EXTERNAL TABLE IF NOT EXISTS table2 LIKE table1;

FROM table1
INSERT OVERWRITE TABLE table2
SELECT * WHERE
col1 = '%somecriteria%' AND
more criteria...
;

Como he dicho anteriormente, este devuelve:

FAILED: Error in semantic analysis: need to specify partition columns because the destination table is partitioned.

Gracias!

2 Comentarios

  1. 1

    Esto siempre me funciona:

    CREATE EXTERNAL TABLE IF NOT EXISTS table2 LIKE table1;
    INSERT OVERWRITE TABLE table2 PARTITION (day) SELECT col1, col2, ..., day FROM table1;
    ALTER TABLE table2 RECOVER PARTITIONS;
    

    Aviso de que he añadido el » día » como una columna en la instrucción SELECT. Observe también que hay un ALTER TABLE línea, la cual es necesaria para la Colmena a ser consciente de las particiones que recién creado en la tabla2.

  2. 0

    Nunca he usado la like opción.. así que gracias por mostrarme que. Será que en realidad crear todas las particiones que la primera tabla tiene así? Si no, que podría ser el problema. Usted podría tratar de usar particiones dinámicas:

    create external table if not exists table2 like table1;
    insert overwrite table table2 partition(part) select col1, col2 from table1;
    

    Podría no ser la mejor solución, como creo que usted tiene que especificar las columnas en la select clause (así como la columna de partición en el partition clause).

    Y, debe activar la partición dinámica.

    Espero que esto ayude.

Dejar respuesta

Please enter your comment!
Please enter your name here