我目前在向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 - 文件选项)。但这不适用于Hive。现在我必须明确添加每个文件。
我这样做错了吗?有没有办法将整个文件夹内容分配给分布式缓存。
P.S。我尝试了外卡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}
现在很好,整洁!
答案 0 :(得分:3)
添加不支持目录,但作为解决方法,您可以压缩文件。然后将其作为存档(ADD ARCHIVE my.zip
)添加到分布式缓存中。当作业运行时,存档的内容将在本地作业目录中解压缩
从节点(参见mapred.job.classpath.archives
属性)
如果您要传递的文件数量相对较少,并且您不想处理存档,您还可以编写一个小脚本,为所有文件准备添加文件命令你有一个给定的目录:
E.g:
#!/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
答案 1 :(得分:0)
嗯,在我的情况下,我不得不移动一个包含子文件夹和文件的文件夹。
我使用了ADD ARCHIVE xxx.gz
,它正在添加文件,但在从机中不爆炸(解压缩)。
相反,ADD FILE <folder_name_without_traling_slash>
实际上将整个文件夹递归地复制到从属服务器。
礼貌:The comments helped debugging
希望这有帮助!