2

我目前在将文件夹内容添加到 Hives 不受信任的缓存时遇到问题。我可以使用以下方法成功地将多个文件添加到 Hive 中的分布式缓存:

ADD FILE /folder/file1.ext;
ADD FILE /folder/file2.ext;
ADD FILE /folder/file3.ext;
etc.

.

我还看到有一个ADD FILES(复数)选项,在我看来这意味着您可以指定一个目录,例如:ADD FILES /folder/;并且文件夹中的所有内容都被包含在内(这适用于 Hadoop Streaming -files 选项)。但这不适用于 Hive。现在我必须明确添加每个文件。

我做错了吗?有没有办法将整个文件夹的内容放到分布式缓存中。

PS我尝试了通配符ADD FILE /folder/*ADD FILES /folder/*但也失败了。

编辑:

从 hive 0.11 开始,现在支持这样:

ADD FILE /folder

现在工作。

我正在使用的是将文件夹位置作为参数传递给配置单元脚本,因此:

$ hive -f my-query.hql -hiveconf folder=/folder

在 my-query.hql 文件中:

ADD FILE ${hiveconf:folder}

现在又漂亮又整洁!

4

2 回答 2

4

Add 不支持目录,但作为一种解决方法,您可以压缩文件。然后将它作为存档( ADD ARCHIVE my.zip) 添加到分布式缓存中。当作业运行时,存档的内容将被解压到从节点的本地作业目录中(见mapred.job.classpath.archives属性)

如果您要传递的文件数量相对较少,并且您不想处理档案,您还可以编写一个小脚本,为给定目录中的所有文件准备添加文件命令
: 例如:

#!/bin/bash
#list.sh

if [ ! "$1" ]
then
  echo "Directory is missing!"
  exit 1
fi

ls -d $1/* | while read f; do echo ADD FILE $f\;; done

然后从 Hive shell 调用它并执行生成的输出:

!/home/user/list.sh /path/to/files
于 2013-03-15T15:01:45.427 回答
0

好吧,就我而言,我必须移动一个包含子文件夹和文件的文件夹。

我使用了ADD ARCHIVE xxx.gz,它正在添加文件,但在从属机器中没有爆炸(解压缩)。

相反,ADD FILE <folder_name_without_traling_slash>实际上将整个文件夹递归地复制到从属服务器。

礼貌:评论帮助调试

希望这可以帮助 !

于 2014-01-28T14:04:33.613 回答