Улей: запись заголовков столбцов в локальный файл? - PullRequest
28 голосов
/ 14 апреля 2011

Документация Hive снова отсутствует:

Я хотел бы записать результаты запроса в локальный файл, а также имена столбцов.

Поддерживает ли Hive это?

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

Кроме того, отдельный вопрос: является ли StackOverflow лучшим местом для получения справки Hive?@ Ниджа, была очень полезна, но я не хочу беспокоить их ...

Ответы [ 7 ]

64 голосов
/ 27 ноября 2011

Попробуйте

set hive.cli.print.header=true;
15 голосов
/ 10 октября 2012

Да, вы можете. Поместите set hive.cli.print.header=true; в .hiverc файл в вашем основном каталоге или в любой другой файл свойств пользователя куста.

Неясное предупреждение: будьте осторожны, так как это приводило к сбою моих запросов в прошлом (но я не могу вспомнить причину).

9 голосов
/ 26 октября 2012

Действительно, ответ @ nija верен - по крайней мере, насколько я знаю.Нет никакого способа записать имена столбцов при выполнении insert overwrite into [local] directory ... (независимо от того, используете ли вы локально или нет).

Что касается сбоев, описанных @ user1735861, в кусте есть известная ошибка 0.7.1 (исправлено в 0.8.0), которое после выполнения set hive.cli.print.header=true; вызывает NullPointerException для любой команды / запроса HQL, которая не производит никакого вывода.Например:

$ 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)

Принимая во внимание, что это нормально:

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

Команды, не относящиеся к HQL, хороши (set, dfs ! и т. Д.)

Подробнее здесь: https://issues.apache.org/jira/browse/HIVE-2334

6 голосов
/ 14 апреля 2011

Hive поддерживает запись в локальный каталог. Ваш синтаксис тоже подходит для этого.
Проверьте документы на SELECTS и FILTERS для получения дополнительной информации.

Я не думаю, что у Hive есть способ записать имена столбцов в файл для выполняемого вами запроса. , , Я не могу точно сказать, что это не так, но я не знаю пути.

Я думаю, что единственное место, которое лучше, чем SO для вопросов Hive, - это список рассылки . * * 1010

4 голосов
/ 09 августа 2014

Я столкнулся с этой проблемой сегодня и смог получить то, что мне нужно, выполнив UNION ALL между исходным запросом и новым фиктивным запросом, который создает строку заголовка. Я добавил столбец сортировки в каждом разделе и установил заголовок в 0, а данные в 1, чтобы я мог отсортировать по этому полю и убедиться, что строка заголовка вышла сверху.

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

Это немного громоздко, но, по крайней мере, вы можете получить то, что вам нужно, с помощью одного запроса.

Надеюсь, это поможет!

3 голосов
/ 20 марта 2013

Не лучшее решение, но вот что я делаю:

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
2 голосов
/ 13 марта 2018

Вот мое мнение. Обратите внимание, я не очень хорошо разбираюсь в bash, поэтому предложения по улучшению приветствуются:)

#!/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/*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...