如何遍历HDFS目录下每个输入文件并为每个文件单独生成对应输出文件
问题原因分析
- 你写的for循环已经成功遍历
${hdfs_input}目录下的每个文件并赋值给变量i,但循环内部的hdfs dfs -cp命令依然使用了通配符${hdfs_input}*,每次循环都会把目录下所有文件都拷贝一次,完全没有用到循环变量,所以最终只会得到合并的输出结果。 - 另外代码里用到的
${hdfs_path}变量没有提前定义,执行时会报错。
修正后的代码
#!/bin/ksh # 定义HDFS输入路径 hdfs_input='inputfilepath/' # 定义输出路径,可根据实际需求修改 hdfs_output_path='outputfilepath/new_dir/' # 遍历输入目录下的每个文件 for file in "${hdfs_input}"* do # 提取当前遍历文件的文件名(去掉路径前缀) filename=$(basename "${file}") # 单独拷贝当前文件到输出目录,可替换为你自己的代码提取逻辑 hdfs dfs -cp "${file}" "${hdfs_output_path}/${filename}" # 此处添加针对单个文件的处理逻辑,用${file}指代当前处理的单个文件即可 done
补充说明
- 如果不需要保留原文件名,要给输出文件加自定义后缀,只需要修改
${hdfs_output_path}/${filename}部分即可,比如改成${hdfs_output_path}/${filename}_processed就能给每个输出文件加上_processed后缀。 - 所有针对单个文件的处理逻辑都写在循环内即可,操作时使用循环变量
file指代当前正在处理的单个文件,不要再次使用通配符匹配整个输入目录。
内容的提问来源于stack exchange,提问作者christy
相关产品推荐
相关产品推荐

