siempre para obligatorio name mantener falta encabezado cómo continuar complétalo columna campo syntax hive

syntax - para - Hive: escribir encabezados de columna a archivo local?



cómo mantener siempre visible el encabezado de columna en excel (7)

Aquí está mi opinión sobre ello. Tenga en cuenta que no estoy muy versado en bash, así que las sugerencias de mejoras son bienvenidas :)

#!/usr/bin/env bash # works like this: # ./get_data.sh database.table > data.csv INPUT=$1 TABLE=${INPUT##*.} DB=${INPUT%.*} HEADER=`hive -e " set hive.cli.print.header=true; use $DB; INSERT OVERWRITE LOCAL DIRECTORY ''$TABLE'' row format delimited fields terminated by '','' SELECT * FROM $TABLE;"` HEADER_WITHOUT_TABLE_NAME=${HEADER//$TABLE./} echo ${HEADER_WITHOUT_TABLE_NAME//[[:space:]]/,} cat $TABLE/*

Falta documentación de la colmena nuevamente:

Me gustaría escribir los resultados de una consulta en un archivo local, así como los nombres de las columnas.

¿Apoya Hive esto?

Insert overwrite local directory ''tmp/blah.blah'' select * from table_name;

Además, pregunte por separado: ¿Es StackOverflow el mejor lugar para obtener ayuda de Hive? @Nija, ha sido de mucha ayuda, pero no para seguir molestándolos ...


De hecho, la respuesta de @ nija es correcta, al menos por lo que yo sé. No hay ninguna forma de escribir los nombres de las columnas al realizar una insert overwrite into [local] directory ... (ya sea que use local o no).

Con respecto a los bloqueos descritos por @ user1735861, hay un error conocido en la sección 0.7.1 (corregido en 0.8.0 ) que, después de hacer el set hive.cli.print.header=true; , provoca una NullPointerException para cualquier comando / consulta HQL que no produzca resultados. Por ejemplo:

$ hive -S hive> use default; hive> set hive.cli.print.header=true; hive> use default; Exception in thread "main" java.lang.NullPointerException at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:222) at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:287) at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:517) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.apache.hadoop.util.RunJar.main(RunJar.java:197)

Considerando que esto está bien:

$ hive -S hive> set hive.cli.print.header=true; hive> select * from dual; c c hive>

Sin embargo, los comandos que no son HQL están bien ( set , dfs ! Etc ...)

Más información aquí: https://issues.apache.org/jira/browse/HIVE-2334


Hive soporta escribir en el directorio local. Tu sintaxis se ve bien para eso también.
Echa un vistazo a los documentos en SELECTOS y FILTROS para obtener información adicional.

No creo que Hive tenga una forma de escribir los nombres de las columnas en un archivo para la consulta que está ejecutando. . . No puedo decir con certeza que no, pero no conozco una manera.

Creo que el único lugar mejor que SO para preguntas de Hive sería la lista de correo .


Me encontré con este problema hoy y pude obtener lo que necesitaba haciendo un UNION ALL entre la consulta original y una nueva consulta ficticia que crea la fila del encabezado. Agregué una columna de clasificación en cada sección y establecí el encabezado en 0 y los datos en 1 para que pudiera ordenar por ese campo y asegurarme de que la fila del encabezado quedara en la parte superior.

create table new_table as select field1, field2, field3 from ( select 0 as sort_col, --header row gets lowest number ''field1_name'' as field1, ''field2_name'' as field2, ''field3_name'' as field3 from some_small_table --table needs at least 1 row limit 1 --only need 1 header row union all select 1 as sort_col, --original query goes here field1, field2, field3 from main_table ) a order by sort_col --make sure header row is first

Es un poco voluminoso, pero al menos puede obtener lo que necesita con una sola consulta.

¡Espero que esto ayude!


No es una gran solución, pero esto es lo que hago:

create table test_dat ROW FORMAT DELIMITED FIELDS TERMINATED BY "/t" STORED AS INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat" OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat" LOCATION ''/tmp/test_dat'' as select * from YOUR_TABLE; hive -e ''set hive.cli.print.header=true;select * from YOUR_TABLE limit 0'' > /tmp/test_dat/header.txt cat header.txt 000* > all.dat


Sí tu puedes. Coloca el set hive.cli.print.header=true; en un archivo .hiverc en su directorio principal o en cualquiera de los otros archivos de propiedades del usuario de la sección.

Advertencia vaga: tenga cuidado, ya que esto ha bloqueado mis consultas en el pasado (pero no puedo recordar la razón).


Tratar

set hive.cli.print.header=true;