Hive: ¿escribir encabezados de columna en un archivo local?
Otra vez falta documentación de la colmena:
Me gustaría escribir los resultados de una consulta en un archivo local, así como los nombres de las columnas.
¿Hive soporta esto?
Insert overwrite local directory 'tmp/blah.blah' select * from table_name;
También, pregunta aparte: ¿Es StackOverflow el mejor lugar para obtener ayuda de Hive? @Nija, ha sido muy útil, pero no para seguir molestándolos...
7 answers
Hive soporta escribir en el directorio local. Tu sintaxis también se ve bien.
Echa un vistazo a los documentos en SELECTS and FILTERS para obtener información adicional.
No creo que Hive tenga una manera de escribir los nombres de las columnas en un archivo para la consulta que está ejecutando . . . No puedo decir con seguridad que no, pero no conozco una manera.
Creo que el único lugar mejor que ESO para las preguntas de la Colmena sería la lista de correo.
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-07-26 07:17:30
Intenta
set hive.cli.print.header=true;
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
2011-11-26 20:42:59
Sí puedes. Ponga el set hive.cli.print.header=true;
en un archivo .hiverc
en su directorio principal o en cualquiera de los otros archivos de propiedades de usuario de hive.
Advertencia vaga: tenga cuidado, ya que esto ha bloqueado consultas mías en el pasado (pero no puedo recordar la razón).
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-07-26 07:23:25
De hecho, la respuesta de @nija es correcta, al menos por lo que yo sé. No hay forma de escribir los nombres de las columnas cuando se hace un insert overwrite into [local] directory ...
(ya sea que se use local o no).
Con respecto a los bloqueos descritos por @user1735861, hay un error conocido en hive 0.7.1
(corregido en 0.8.0
) que, después de hacer set hive.cli.print.header=true;
, causa un NullPointerException
para cualquier comando/consulta HQL que no produce salida. 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 no HQL están bien (set
,dfs
!
, etc...)
Más información aquí: https://issues.apache.org/jira/browse/HIVE-2334
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
2012-10-26 15:04:34
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
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-03-20 17:19:36
Me encontré con este problema hoy y pude obtener lo que necesitaba haciendo una UNIÓN entre la consulta original y una nueva consulta ficticia que crea la fila de encabezado. Agregué una columna de ordenación en cada sección y establecí el encabezado en 0 y los datos en 1 para poder ordenar por ese campo y garantizar que la fila del encabezado saliera 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!
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-08-09 01:40:30
Aquí está mi opinión. Nota, no estoy muy versado en bash, por lo 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/*
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-03-13 15:17:04