将列名称传递给Hadoop Hive流式传输作业

时间:2012-10-12 14:03:10

标签: hadoop streaming hive

我正在Hive中编写一个Hadoop流媒体作业,我希望我的流媒体脚本能够知道它正在接收的表的列名。我已经尝试设置set hive.cli.print.header=true;,但这会将名称打印到控制台,而不会让脚本可用(据我所知)。

理想情况下,我也可以提供数据类型。

Hadoop Streaming API或Hive中是否有一个选项可以让我捕获流媒体作业中的列名?

更新:我能够提取Hadoop环境变量,并从我的Hive脚本中设置任意变量,并在我的流式脚本中提供它们。我正在调查访问这些环境变量是否允许我访问数据列名称或以黑客方式传递它们。

1 个答案:

答案 0 :(得分:3)

我正在提交答案,但只有当“初始”数据包含列名即时才会有效。数据应该具有某种键值对结构。您现在可以在hive中存储带有地图结构的输入类型,并根据键进行查询。我会举个例子。

假设你在位置'/ user / input'的hdfs中有一个文件,数据如下

A B C1=D1:C2=D2:C3=D3:C7=D4
E F C1=H1:C7=H2:C5=H4

在配置单元中执行以下操作:

hive>> create external table my_external_table 
       (column1 string, column2 string, my_map map<string,string>) 
       row format delimited 
       fields terminated by ' ' 
       collection items terminated by ':' 
       map keys terminated by '=' 
       lines terminated by '\n' 
       stored as textfile location '/user/input';
hive>> select * from my_external_table;
result>> A B {"C1":"D1","C2":"D2","C3":"D3","C7":"D4"}
         E F {"C1":"H1","C7":"H2","C5":"H4"}

现在您可以执行查询

hive >> select map_keys[my_map] from my_external_table;
result >> ["C1","C2","C3","C7"]
hive >> select map_values[my_map] from my_external_table;
result >> ["D1","D2","D3","D4"]
          ["H1","H2","H3","H4"]
hive >> select "C1",my_map['C1'] from my_external_table;
result >> C1    D1
          C1    H1
hive >> select map("C1",my_map['C1']) from my_external_table;
result >> {"C1":"D1"}
          {"C1":"H1"}

据说您想要创建一个包含一些现有地图键值的新表,请执行以下操作:

hive >> create table my_new_table as select map('C1',my_map['C1'],'C2',my_map['C2']) from my_external_table;
hive >> select * from my_new_table;
result >> {"C1":"D1","C2":"D2"}
          {"C1":"H1","C2":null}

因此,使用上面的方法,我可以创建新表来存储键名和值名称,并对它们执行任何类型的转换,前提是,初始数据存储为键值对

注意

  1. 您可以轻松创建一个脚本,根据需要将列名添加到您的配置单元查询中。
  2. 假设您的“初始”数据不包含列名,您可以将数据转换为包含列名。或者,您可以使用自定义映射器将数据作为键值对回显出来
  3. 我保留了自己的分隔符,可以随意根据需要进行更改。
  4. 您也不必拥有column1和column2。我只是告诉你,所有数据都不必是键值对