¿Cómo envío los resultados de una consulta HiveQL a CSV?


Nos gustaría poner los resultados de una consulta Hive en un archivo CSV. Pensé que el comando debería verse así:

insert overwrite directory '/home/output.csv' select books from table;

Cuando lo corro, dice que se completó con éxito, pero nunca puedo encontrar el archivo. ¿Cómo puedo encontrar este archivo o debo extraer los datos de una manera diferente?

Gracias!

Author: Vldb.User, 2013-08-08

10 answers

Aunque es posible usar INSERT OVERWRITE para obtener datos de Hive, puede que no sea el mejor método para su caso particular. Primero déjame explicar lo que hace INSERT OVERWRITE, luego describiré el método que uso para obtener archivos tsv de tablas Hive.

De acuerdo con el manual, su consulta almacenará los datos en un directorio en HDFS. El formato no será csv.

Los datos escritos en el sistema de archivos se serializan como texto con columnas separadas por ^A y filas separadas por nuevas líneas. Si alguna de las columnas no es de tipo primitivo, entonces esas columnas se serializan en formato JSON.

Una ligera modificación (añadiendo la palabra clave LOCAL) almacenará los datos en un directorio local.

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;

Cuando corro una consulta similar, así es como se ve la salida.

[lvermeer@hadoop temp]$ ll
total 4
-rwxr-xr-x 1 lvermeer users 811 Aug  9 09:21 000000_0
[lvermeer@hadoop temp]$ head 000000_0 
"row1""col1"1234"col3"1234FALSE
"row2""col1"5678"col3"5678TRUE

Personalmente, normalmente corro mi consulta directamente a través de Hive en la línea de comandos para este tipo de cosas, y la canalizo en el archivo local de la siguiente manera:

hive -e 'select books from table' > /home/lvermeer/temp.tsv

Eso me da un archivo separado por pestañas que puedo usar. Espero que sea útil para usted también.

Basado en este parche-3682, sospecho que hay una mejor solución disponible al usar Hive 0.11, pero no puedo probarlo yo mismo. La nueva sintaxis debería permitir lo siguiente.

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
select books from table;

Espero que eso ayude.

 138
Author: Lukas Vermeer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-09 07:44:12

Si desea un archivo CSV, puede modificar las soluciones de Lukas de la siguiente manera (suponiendo que esté en una caja de Linux):

hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
 21
Author: David Kjerrumgaard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-23 19:43:48

Debe usar la instrucción CREATE TABLE AS SELECT (CTAS) para crear un directorio en HDFS con los archivos que contienen los resultados de la consulta. Después de eso, tendrá que exportar esos archivos desde HDFS a su disco normal y fusionarlos en un solo archivo.

También es posible que tenga que hacer algún truco para convertir los archivos de '\001' - delimitado a CSV. Puede utilizar un SerDe CSV personalizado o postprocesar el archivo extraído.

 4
Author: Olaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-08 17:23:40

Si está utilizando HUE, esto también es bastante simple. Simplemente vaya al editor de la colmena en HUE, ejecute su consulta de la colmena, luego guarde el archivo de resultado localmente como XLS o CSV, o puede guardar el archivo de resultado en HDFS.

 3
Author: Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-29 18:00:38

Estaba buscando una solución similar, pero las mencionadas aquí no funcionarían. Mis datos tenían todas las variaciones de espacios en blanco (espacio, nueva línea, tabulación) caracteres y comas.

Para hacer que los datos de columna tsv sean seguros, reemplacé todos los caracteres \t en los datos de columna con un espacio, y ejecuté código python en la línea de comandos para generar un archivo csv, como se muestra a continuación:

hive -e 'tab_replaced_hql_query' |  python -c 'exec("import sys;import csv;reader = csv.reader(sys.stdin, dialect=csv.excel_tab);writer = csv.writer(sys.stdout, dialect=csv.excel)\nfor row in reader: writer.writerow(row)")'

Esto creó un csv perfectamente válido. Espero que esto ayude a aquellos que vienen en busca de esta solución.

 3
Author: sisanared,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-27 00:49:34

Puede usar la función cadena de colmena CONCAT_WS( string delimiter, string str1, string str2...strn )

Para ex:

hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv
 3
Author: Ram Ghadiyaram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-27 07:26:20

Puede utilizar INSERT ... DIRECTORY ..., como en este ejemplo:

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';

OVERWRITE y LOCAL tienen las mismas interpretaciones que antes y los caminos se interpretan siguiendo las reglas habituales. Se escribirán uno o más archivos en /tmp/ca_employees, dependiendo del número de reductores invocados.

 2
Author: bigmakers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-27 07:42:20

Tuve un problema similar y así es como pude abordarlo.

Paso 1 - Cargó los datos de la tabla de la colmena en otra tabla de la siguiente manera

DROP TABLE IF EXISTS TestHiveTableCSV;
CREATE TABLE TestHiveTableCSV 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n' AS
SELECT Column List FROM TestHiveTable;

Paso 2 - Copiado el blob desde Hive warehouse a la nueva ubicación con la extensión apropiada

Start-AzureStorageBlobCopy
-DestContext $destContext 
-SrcContainer "Source Container"
-SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0"
-DestContainer "Destination Container"
-DestBlob "CSV/TestHiveTable.csv"
 2
Author: Dattatrey Sindol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-30 12:48:27

El separador predeterminado es "^A". En el lenguaje python, es " \x01".

Cuando quiero cambiar el delimitador, uso SQL como:

SELECT col1, delimiter, col2, delimiter, col3, ..., FROM table

Entonces, considere delimiter+"^A" como un nuevo delimitador.

 1
Author: moshaholo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-27 07:59:04

Similar a la respuesta de Ray anterior, Hive View 2.0 en Hortonworks Data Platform también le permite ejecutar una consulta de Hive y luego guardar la salida como csv.

 0
Author: schoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-03 13:35:43