如何从HDFS复制指定CSV文件并保留原目录结构?
解决HDFS仅复制指定模式文件并保留目录结构的方法
方法一:使用HDFS自带筛选参数(推荐)
HDFS的dfs -get(与copyToLocal功能一致)支持--include和--exclude参数过滤文件,且默认保留原目录结构。
执行以下命令:
hdfs dfs -get --include="*.csv" --exclude="*" /some/path ./local_target_dir
--include="*.csv":仅匹配CSV格式文件--exclude="*":排除所有其他类型文件./local_target_dir:本地目标目录,无需提前创建,命令会自动生成与HDFS对应的子目录结构(如local_target_dir/report01/、local_target_dir/report02/等)
该方式既不会复制无关大文件,也能完整保留原有目录层级,且每个report下的CSV文件会存放在各自子目录中,避免重名冲突。
方法二:Shell脚本遍历复制(适配复杂筛选场景)
若旧版本HDFS不支持上述参数,可通过Shell脚本手动处理:
#!/bin/bash HDFS_SRC="/some/path" LOCAL_DEST="./local_target_dir" # 遍历HDFS中所有CSV文件 hdfs dfs -find $HDFS_SRC -name "*.csv" | while read hdfs_file; do # 提取文件相对路径(去除HDFS根路径前缀) relative_path=${hdfs_file#$HDFS_SRC/} # 构建本地目标文件路径 local_file="$LOCAL_DEST/$relative_path" # 创建本地目录(不存在则自动生成) mkdir -p $(dirname "$local_file") # 复制单个CSV文件到对应目录 hdfs dfs -copyToLocal "$hdfs_file" "$local_file" done
将脚本保存为copy_hdfs_csv.sh,赋予执行权限chmod +x copy_hdfs_csv.sh后运行即可。脚本会逐个处理CSV文件,先创建匹配的本地目录再复制,完全保留原结构且无重名问题。
内容的提问来源于stack exchange,提问作者leleogere
相关产品推荐
相关产品推荐

