HIve: записывать заголовки столбцов в локальный файл?
Документация на улей снова отсутствует:
Я хотел бы написать результаты запроса в локальном файле, а также имена столбцов.
Поддерживает ли Hive это?
Insert overwrite local directory 'tmp/blah.blah' select * from table_name;
Кроме того, отдельный вопрос: является ли StackOverflow лучшим местом для получения справки о кустах? @Nija, был очень полезен, но я не хочу их беспокоить...
Ответы
Ответ 1
Hive поддерживает запись в локальный каталог. Синтаксис выглядит так же хорошо.
За дополнительной информацией обращайтесь к документам на SELECTS и FILTERS.
Я не думаю, что у Hive есть способ записать имена столбцов в файл для запроса, который вы используете., Я не могу сказать точно, что это не так, но я не знаю, как это сделать.
Я думаю, что единственное место, которое лучше, чем SO для вопросов в Hive, будет список рассылки.
Ответ 2
Try
set hive.cli.print.header=true;
Ответ 3
Да, вы можете. Поместите set hive.cli.print.header=true;
в файл .hiverc
в вашем основном каталоге или в любом из других файлов свойств пользователя улья.
Неясное предупреждение: будьте осторожны, так как это привело к моим запросам в прошлом (но я не могу вспомнить причину).
Ответ 4
Действительно, ответ @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
Ответ 5
Не отличное решение, но вот что я делаю:
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
Ответ 6
Сегодня я столкнулся с этой проблемой и смог получить то, что мне нужно, выполнив 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
Это немного громоздко, но по крайней мере вы можете получить то, что вам нужно, с помощью одного запроса.
Надеюсь, это поможет!