蜂巢:将列标题写入本地文件?

| Hive文档再次缺乏: 我想将查询结果以及列名写入本地文件。 Hive支持吗?
Insert overwrite local directory \'tmp/blah.blah\' select * from table_name;
另外,还有一个单独的问题:StackOverflow是获得Hive帮助的最佳场所吗? @Nija一直非常有帮助,但我不想一直困扰着他们……     
已邀请:
Hive不支持写入本地目录。您的语法也很合适。 查阅SELECTS和FILTERS上的文档以获取更多信息。 我认为Hive无法将列名写入正在运行的查询的文件中。 。 。我不能肯定地说不,但是我不知道有什么办法。 我认为,关于Hive问题的唯一优于SO的地方是邮件列表。     
尝试
set hive.cli.print.header=true;
    
是的你可以。将ѭ2放入主目录中的
.hiverc
文件或任何其他配置用户属性文件中。 模糊警告:请小心,因为这过去曾使我的查询崩溃(但我不记得原因)。     
实际上,@ nija的答案是正确的-至少据我所知。进行
insert overwrite into [local] directory ...
时,没有任何方法可以写入列名称(无论是否使用本地)。 关于@ user1735861所描述的崩溃,配置单元
0.7.1
(已在ѭ6in中修复)中存在一个已知的错误,该错误在执行after2ѭ之后,对任何不产生输出的HQL命令/查询造成causes8ѭ。例如: $蜂巢-S 蜂巢>使用默认; hive>设置hive.cli.print.header = true; 蜂巢>使用默认; 线程\“ main \”中的异常java.lang.NullPointerException     在org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:222)     在org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:287)     在org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:517)     在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处     在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)     在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:616)     在org.apache.hadoop.util.RunJar.main(RunJar.java:197) 这样做很好: $蜂巢-S hive>设置hive.cli.print.header = true; 蜂巢>从双选择*; C C 蜂巢> 非HQL命令也可以(
set
dfs
!
等) 此处更多信息:https://issues.apache.org/jira/browse/HIVE-2334     
今天,我遇到了这个问题,通过在原始查询和创建标题行的新虚拟查询之间进行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
它有点笨重,但是至少您可以通过一个查询获得所需的内容。 希望这可以帮助!     
这不是一个很好的解决方案,但是我要做的是:
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
    
这是我的看法。注意,我不太熟悉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/*
    

要回复问题请先登录注册