我在HDFS中有以下目录结构,
/analysis/alertData/logs/YEAR/MONTH/DATE/HOURS
即数据即将发布,并以年/月/日/小时的格式存储。
我写了一个shell脚本,我将路径传递到
"/analysis/alertData/logs" ( this will vary depending on what product of data i am handling)
然后shell脚本遍历年/月/日/小时文件夹并返回最新路径。
例如:
Directories present in HDFS has following structure:
/analysis/alertData/logs/2014/10/22/01
/analysis/alertData/logs/2013/5/14/04
shell script is given path till : " /analysis/alertData/logs "
it outputs most recent directory : /analysis/alertData/logs/2014/10/22/01
我的问题是如何验证HDFS目录路径传递给shell脚本是否有效。让我说我传递一个错误的路径作为输入或路径不存在所以如何在shell脚本中处理它。
示例错误路径可以是:
wrong path : /analysis/alertData ( correct path : /analysis/alertData/logs/ )
wrong path : /abc/xyz/ ( path does not exit in HDFS )
我尝试使用Hadoop dfs -test -z / -d / -e选项对我没用。 对此有任何建议。
注意:不在此处发布我的原始代码,因为我的问题的解决方案不依赖于它。
提前致谢。
答案 0 :(得分:21)
尝试使用w / o测试命令[]:
if $(hadoop fs -test -d $yourdir) ; then echo "ok";else echo "not ok"; fi
答案 1 :(得分:4)
您好我使用以下脚本来测试HDFS目录是否存在。我在你的问题中看到你尝试过这个测试命令并没有奏效。你能否提供一些关于为什么不起作用的追踪......
hadoop fs -test -d $dirpath
if [ $? != 0 ]
then
hadoop fs -mkdir $dirpath
else
echo "Directory already present in HDFS"
fi
答案 2 :(得分:4)
Hadoop fs已弃用 用法:hdfs dfs -test - [ezd] URI
选项: -e选项将检查文件是否存在,如果为true则返回0。 -z选项将检查文件是否为零长度,如果为true则返回0。 -d选项将检查路径是否为目录,如果为true则返回0。 示例:hdfs dfs -test -d $ yourdir
请查看以下内容以获取更多信息:https://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-common/FileSystemShell.html 此致
答案 3 :(得分:0)
适用于带有火花的 Scala。
import org.apache.hadoop.fs.{FileSystem, Path}
val fs = FileSystem.get(spark.sparkContext.hadoopConfiguration)
val fileExists = fs.exists(new Path(<HDFSPath>)) //return boolean of true or false
答案 4 :(得分:-1)
在Java中,我们可以使用FileSystem类来验证这一点。