我正在寻找在HDFS中重命名多个数据文件的解决方案,我说26000个具有相同名称的数据文件/data/sample/_file.json.zip,并从文件末尾删除.zip,例如/ data / sample / _file.json
我想做什么..
我可以喜欢一个文件
hdfs dfs -mv /data/sample/abc12300021b9_file.json.zip /data/sample/abc12300021b9_file.json
我想做的是重命名所有26000个数据文件,例如,我收到以下消息
hdfs dfs -mv /data/sample/*_file.json.zip /data/sample/*_file.json
mv:`/data/sample/*_file.json':匹配项过多
此代码正在执行我想要的操作,但问题是它非常慢,它适合100或200个数据文件,当我处理成千上万个文件时,速度非常慢。
#!/bin/bash
source_dir=/data/sample/
$(hdfs dfs -test -e ${source_dir})
hdfs dfs -ls "${source_dir}/*.zip" | awk '{print $8}' | while read FILE; do
FILENAME="$(basename "${FILE}")"
new_name=${FILENAME::-4}
hdfs dfs -mv "${source_dir}/${FILENAME}" "${source_dir}/${new_name}"
done
答案 0 :(得分:0)
尝试在bash中循环
for n in {0..26000} ; do
long=$(printf %05d "$n")
hdfs dfs -mv /data/sample/"$long"_file.json.zip /data/sample/"$long"_file.json
done
答案 1 :(得分:0)
您可以使用Pig脚本来执行此操作。它应该看起来像这样:
fs -mv /data/sample/abc12300021b9_file.json.zip /data/sample/abc12300021b9_file.json
fs -mv /data/sample/AAAAAAAA.json.zip /data/sample/AAAAAAAA.json
fs -mv /data/sample/AAAAAAAB.json.zip /data/sample/AAAAAAAB.json
....
假设文件已另存为mv_26000_files
。然后运行:
pig -f mv_26000_files
这将更快很多,因为在使用HDFS CLI的情况下,身份验证仅被调用一次,因此您每次都调用它。
注意:Pig在所有主要的Hadoop发行版(CDH,HDP,MapR)上均可用。