Hadoop将grep结果输出至不同目录下新文件时出现错误
解决Hadoop命令重定向报错的问题
嘿,我来帮你排查这个报错的原因!你遇到的No such file or directory其实是本地Shell在报错,不是Hadoop的问题——核心原因是你用了>这个本地重定向符,它会试图把结果写到本地电脑的文件系统里的/energydata/2015/01/01.txt,但这个本地路径的目录要么没创建,要么你其实是想把结果写到HDFS里?分两种情况给你解决办法:
情况1:目标是写入本地文件系统
如果确实要把结果存在本地,那得先把本地的目录结构建好:
- 先执行这条命令创建本地目录(
-p参数会自动创建多级目录):
mkdir -p /energydata/2015/01
- 然后再跑你原来的命令,这时候本地目录已经存在,重定向就能正常写入文件了:
hadoop fs -cat /Final_Dataset/c*.txt | grep 2015-01-* > /energydata/2015/01/01.txt
情况2:目标是写入HDFS文件系统
如果你的/energydata/2015/01/01.txt是在HDFS上,那不能用本地的>,得用Hadoop的命令来处理,给你两种简便的方法:
方法一:临时文件中转
先把结果写到本地临时文件,再上传到HDFS:
# 先把结果存到本地临时文件 hadoop fs -cat /Final_Dataset/c*.txt | grep 2015-01-* > /tmp/temp_201501.txt # 先创建HDFS的目标目录(如果还没建) hadoop fs -mkdir -p /energydata/2015/01 # 把临时文件上传到HDFS指定路径 hadoop fs -put /tmp/temp_201501.txt /energydata/2015/01/01.txt # 可选:用完临时文件后删掉它 rm /tmp/temp_201501.txt
方法二:直接通过管道写入HDFS
不用临时文件,直接把管道的输出传给Hadoop命令写入HDFS:
# 先创建HDFS的目标目录 hadoop fs -mkdir -p /energydata/2015/01 # 直接将grep的结果写入HDFS文件,这里的`-`代表读取标准输入的内容 hadoop fs -cat /Final_Dataset/c*.txt | grep '2015-01-' | hadoop fs -put - /energydata/2015/01/01.txt
最后提个小建议:你原来的grep 2015-01-*里的*可能会被本地Shell当成文件名去匹配,建议用单引号把匹配模式包起来(像上面方法二里那样),避免本地Shell的干扰,匹配也更准确。如果是要匹配具体的日期格式,比如2015-01-01到2015-01-31,可以写成grep '2015-01-[0-9][0-9]'哦。
内容的提问来源于stack exchange,提问作者PGNewbie
相关产品推荐
相关产品推荐

