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...

 27
Author: Denilson Sá Maia, 2011-04-14

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.

 6
Author: QuinnG,
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;
 60
Author: iggy,
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).

 15
Author: Dan B,
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

 9
Author: Hercynium,
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
 3
Author: Jeremy,
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!

 2
Author: McLeodComputing,
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/*
 2
Author: tdgs,
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