Aunque se puede utilizar INSERT OVERWRITE
para obtener datos de Hive, es posible que no sea el mejor método para su caso particular. Primero déjeme explicar qué INSERT OVERWRITE
hace, luego describiré el método que uso para obtener archivos tsv de las tablas de Hive.
Según 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 en formato JSON.
Una ligera modificación (agregando la LOCAL
palabra clave) 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, generalmente ejecuto mi consulta directamente a través de Hive en la línea de comando para este tipo de cosas, y la canalizo al archivo local de esta manera:
hive -e 'select books from table' > /home/lvermeer/temp.tsv
Eso me da un archivo separado por tabulaciones que puedo usar. Espero que también te sea útil.
Basado en este parche-3682 , sospecho que hay una mejor solución disponible cuando se usa Hive 0.11, pero no puedo probarlo por mí 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 ayude.
Si desea un archivo CSV, puede modificar las soluciones de Lukas de la siguiente manera (asumiendo que está en una caja de Linux):
fuente
Debe utilizar 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 de HDFS a su disco normal y fusionarlos en un solo archivo.
También es posible que tenga que hacer algunos trucos para convertir los archivos de '\ 001' - delimitados a CSV. Puede utilizar un CSV SerDe personalizado o posprocesar el archivo extraído.
fuente
Puede utilizar
INSERT
……DIRECTORY
, como en este ejemplo:OVERWRITE
yLOCAL
tienen las mismas interpretaciones que antes y los caminos se interpretan siguiendo las reglas habituales. Se escribirán uno o más archivos/tmp/ca_employees
, según el número de reductores invocados.fuente
Si está utilizando HUE, esto también es bastante simple. Simplemente vaya 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.
fuente
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 la columna sean seguros, reemplacé todos los caracteres \ t en los datos de la columna con un espacio y ejecuté el código de Python en la línea de comandos para generar un archivo csv, como se muestra a continuación:
Esto creó un csv perfectamente válido. Espero que esto ayude a aquellos que vienen buscando esta solución.
fuente
Puede usar la función de cadena de colmena
CONCAT_WS( string delimiter, string str1, string str2...strn )
por ejemplo:
fuente
Esta es la forma más amigable de csv que encontré para generar los resultados de HiveQL.
No necesita ningún comando grep o sed para formatear los datos, en su lugar, hive lo admite, solo necesita agregar una etiqueta adicional de formato de salida.
fuente
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
Paso 2 : copió el blob del almacén de Hive en la nueva ubicación con la extensión adecuada
fuente
o
Para tsv, simplemente cambie csv a tsv en las consultas anteriores y ejecute sus consultas
fuente
El separador predeterminado es "
^A
". En lenguaje Python, es "\x01
".Cuando quiero cambiar el delimitador, uso SQL como:
Luego, considere delimitador + "
^A
" como un nuevo delimitador.fuente
Probé varias opciones, pero esta sería una de las soluciones más simples para
Python
Pandas
:También puede utilizar
tr "|" ","
para convertir "|" a ","fuente
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.
fuente
En caso de que lo esté haciendo desde Windows, puede usar el script de Python hivehoney para extraer los datos de la tabla al archivo CSV local.
Va a:
Ejecútelo así:
fuente
Solo para cubrir más pasos siguientes después de iniciar la consulta:
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table;
En mi caso, los datos generados en la carpeta temporal están en
deflate
formato y se ve así:Aquí está el comando para descomprimir los archivos desinflados y poner todo en un archivo csv:
fuente
Puede que llegue tarde a este, pero ayudaría con la respuesta:
echo "COL_NAME1 | COL_NAME2 | COL_NAME3 | COL_NAME4"> SAMPLE_Data.csv colmena -e 'seleccionar concat distinto (COL_1, "|", COL_2, "|", COL_3, "|", COL_4) de table_Name donde la cláusula si es necesario;' >> SAMPLE_Data.csv
fuente
Este comando de shell imprime el formato de salida en csv
output.txt
sin los encabezados de columna.fuente
Usa el comando:
colmena -e "use [nombre_base_datos]; seleccione * de [nombre_tabla] LIMIT 10;" > /ruta/a/archivo/mi_nombre_archivo.csv
Tenía un enorme conjunto de datos cuyos detalles estaba tratando de organizar y determinar los tipos de ataques y los números de cada tipo. Un ejemplo que usé en mi práctica que funcionó (y tenía un poco más de detalles) es algo como esto:
fuente