Hive: запись заголовков столбцов в локальный файл?

Снова отсутствует документация по улью:

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

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

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

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


person CMaury    schedule 13.04.2011    source источник


Ответы (7)


Hive поддерживает запись в локальный каталог. Ваш синтаксис тоже подходит для этого.
Ознакомьтесь с документацией по SELECTS и ФИЛЬТРЫ для получения дополнительной информации.

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

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

person QuinnG    schedule 14.04.2011

Пытаться

set hive.cli.print.header=true;
person iggy    schedule 26.11.2011
comment
Есть ли способ сделать это навсегда по умолчанию вместо того, чтобы указывать этот параметр при каждой оболочке улья и / или вызове команды? - person J.D.; 02.10.2012
comment
Я пробовал это; это приводит к тому, что заголовок выводится на консоль, а не в локальный файл. . . - person maverick; 10.11.2012
comment
@JD Да, просто поместите его в .hiverc файл в своем домашнем каталоге - person wlk; 16.09.2013
comment
Похоже, он работает только в CLI; однако не имеет никакого эффекта при запуске файла SQL или из Oozie - person Pasha; 25.08.2015
comment
Вы пробовали запустить это самостоятельно? Я не получаю файл заголовка в наборе выходных данных ... любая помощь? - person Nitin Mahesh; 01.12.2015
comment
он выглядит как имя_таблицы.имя_столбца. Есть ли способ получить просто имя таблицы? - person JGS; 13.05.2016
comment
Это не отвечает на вопрос OP - person David דודו Markovitz; 03.04.2017

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

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

person Dan B    schedule 10.10.2012
comment
Свойство hive.cli.print.header = true не будет работать для команды «Вставить перезапись локального каталога». он работает, если мы запустим 'hive -e' select .. '›Out.tsv' - person Munesh; 30.07.2016

Действительно, ответ @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, подойдут (_6 _, _ 7_ ! и т. Д.)

Дополнительная информация здесь: https://issues.apache.org/jira/browse/HIVE-2334

person Hercynium    schedule 26.10.2012

Сегодня я столкнулся с этой проблемой и смог получить то, что мне нужно, выполнив 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

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

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

person McLeodComputing    schedule 09.08.2014
comment
Это не удастся, если значения col являются логическими, массивами и т. Д. - person amrk7; 12.09.2016
comment
В основном хорошее решение, но 1) вам больше не нужны 'from some_small_table' и limit 2) вы должны включить sort_col в основной выбор 3) вам нужна точка с запятой в конце - person gyorgyabraham; 26.02.2019

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

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
person Jeremy    schedule 20.03.2013
comment
это может быть очень медленно - person OneSolitaryNoob; 02.10.2014

Вот мой взгляд на это. Обратите внимание, я не очень хорошо разбираюсь в 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/*
person tdgs    schedule 13.03.2018