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;