hive从逗号分隔的绝对文件路径列表中加载数据

时间:2012-09-10 10:17:43

标签: hadoop hbase hive partitioning oozie

参考以下配置单元命令:

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

我可以用逗号分隔的绝对文件路径列表吗?
LOAD DATA INPATH 'hdfs://foo/bar1,hdfs://foo/bar2' INTO TABLE foo1

我正在寻找的实际用例:

使用

<datasets>
      <dataset name="input1">
         <uri-template>hdfs://foo/bar/a</uri-template>
      </dataset>
</datasets>
<input-events>
      <data-in name="coordInput1" dataset="input1">
          <start-instance>${coord:current(-23)}</start-instance>
          <end-instance>${coord:current(0)}</end-instance>
      </data-in>
</input-events>
<action>
  <workflow>
         ...
     <configuration>
       <property>
          <name>input_files</name>
          <value>${coord:dataIn('coordInput1')}</value>
       </property>
     </configuration>
  </workflow>
 </action>     
在co-ordinator.xml中的

,假设有一组合格的24个hdfs位置作为我的输入。 如果我的hive查询是某种将数据加载到所有这些位置的表中,我想使用它像: CREATE TABLE table1( col1 STRING )LOCATION($ {input_files});

但是,这在蜂巢中不起作用。 假设:input_files解析为hdfs://foo/bar/1,hdfs://foo/bar/2,hdfs://foo/bar/3这不会成为hive中的有效位置。

我理解实现这一点的唯一方法是,运行一个java mapper,它将input_files作为输入并输出一个运行的动态配置单元脚本

`LOAD DATA INPATH 'hdfs://foo/bar/1' INTO TABLE foo1`
`LOAD DATA INPATH 'hdfs://foo/bar/2' INTO TABLE foo1`

分开。

所以,最后,我的问题是,当我能够解析我感兴趣的整个数据集时,我可以将其用作${coord:dataIn('coordInput1')},我不能利用它来实现这一目标,避免个别LOAD DATA..ALTER TABLE ADD PARTITIONS..个人陈述?

1 个答案:

答案 0 :(得分:0)

使用java动作节点执行此逻辑。您可以使用逗号拆分input_files并使用hive jdbc连接在所有输入位置的循环中执行hive命令。