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

nos gustaría poner los resultados de una consulta de 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 ejecuto, 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!

Aunque es posible utilizar INSERT OVERWRITE para sacar datos de Hive, puede que no sea el mejor método para su caso particular. Primero permítame explicar qué hace INSERT OVERWRITE , luego describiré el método que uso para obtener los archivos tsv de las tablas de 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 líneas nuevas. Si alguna de las columnas no es de tipo primitivo, esas columnas se serializan al formato JSON.

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

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

Cuando ejecuto una consulta similar, así es como se ve el resultado.

 [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 ejecuto mi consulta directamente a través de Hive en la línea de comando para este tipo de cosas, y la canalizo en el archivo local como sigue:

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

Eso me da un archivo separado por tabuladores que puedo usar. Espero que sea útil para ti también.

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

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

Espero que ayude.

Si desea un archivo CSV, puede modificar las soluciones de Lukas de la siguiente manera (suponiendo que se encuentre en un cuadro de Linux):

 hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv 

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, deberá exportar esos archivos de HDFS a su disco habitual y fusionarlos en un único archivo.

También podría tener que hacer algún truco para convertir los archivos de ‘\ 001’ – delimitado a CSV. Puede usar un SerDe de CSV personalizado o posprocesar el archivo extraído.

Si está utilizando HUE, esto es bastante simple también. Simplemente diríjase al editor de Hive en HUE, ejecute su consulta de hive, luego guarde el archivo de resultados localmente como XLS o CSV, o puede guardar el archivo de resultados en HDFS.

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

Para garantizar la seguridad de los datos de la columna, reemplacé todos los caracteres \ t en los datos de la columna con un espacio y ejecuté el 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ó una csv perfectamente válida. Espero que esto ayude a aquellos que buscan esta solución.

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

por ejemplo:

 hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv 

Puede usar INSERTDIRECTORY …, 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 las rutas se interpretan siguiendo las reglas habituales. Uno o más archivos se escribirán en /tmp/ca_employees , dependiendo de la cantidad de reductores invocados.

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

Paso 1 – Cargó los datos de la tabla Hive 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 : copió el blob del almacén de Hive en la nueva ubicación con la extensión adecuada

 Start-AzureStorageBlobCopy -DestContext $destContext -SrcContainer "Source Container" -SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0" -DestContainer "Destination Container" -DestBlob "CSV/TestHiveTable.csv" 

El separador predeterminado es ” ^A “. En lenguaje python, es ” \x01 “.

Cuando quiero cambiar el delimitador, uso SQL como:

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

Luego, considere el delimitador + ” ^A ” como un nuevo delimitador.

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