Pig存储输出至CSV文件异常:生成文件夹而非指定文件求助
解决Pig STORE命令生成文件夹而非指定CSV文件的问题
这是Pig(依托底层Hadoop MapReduce机制)的默认正常行为,并不是命令执行出错了。原因很直接:Pig处理数据时会启动MapReduce任务,每个Reducer任务会输出一个part-*格式的分片文件,因此它会自动创建一个以你指定文件名命名的文件夹,用来存放这些分片文件,而非直接生成单个文件。
另外要提醒你:你的原命令没有指定CSV的分隔符,默认Pig会用制表符分隔字段,所以即使生成了文件,也不是标准的CSV格式,这点需要一起修正。
下面是几种实用的解决思路,按需选择:
方法1:强制生成单个分片文件(适合小数据量场景)
如果你的数据量不大,可以先将Reducer数量设为1,让MapReduce只生成一个输出文件,之后再手动重命名为目标CSV:
-- 先设置Reducer数量为1,确保只生成一个输出分片 SET mapreduce.job.reduces 1; -- 指定用逗号作为分隔符,存储标准CSV格式 STORE A INTO '/home/cloudera/Downloads/res_temp' USING PigStorage(',');
执行完成后,你会得到/home/cloudera/Downloads/res_temp文件夹,里面有一个part-r-00000文件,接着用HDFS命令完成重命名和清理:
# 把分片文件重命名为目标CSV hdfs dfs -mv /home/cloudera/Downloads/res_temp/part-r-00000 /home/cloudera/Downloads/res.csv # 删除空的临时文件夹 hdfs dfs -rm -r /home/cloudera/Downloads/res_temp
方法2:合并分片文件为单个CSV(适合大数据量场景)
如果数据量较大,用单个Reducer会影响处理性能,建议先正常存储分片文件,再用HDFS的getmerge命令合并为单个本地CSV:
-- 正常存储CSV格式数据到临时文件夹 STORE A INTO '/home/cloudera/Downloads/res_temp' USING PigStorage(',');
然后在终端执行合并命令:
# 将HDFS文件夹内的所有分片文件合并到本地的res.csv hdfs dfs -getmerge /home/cloudera/Downloads/res_temp/* /home/cloudera/Downloads/res.csv # 清理临时文件夹 hdfs dfs -rm -r /home/cloudera/Downloads/res_temp
方法3:在Pig脚本中一站式完成(可选)
如果你想在Pig脚本里自动化完成所有操作,可以用sh命令调用Shell指令:
SET mapreduce.job.reduces 1; STORE A INTO '/home/cloudera/Downloads/res_temp' USING PigStorage(','); -- 调用Shell命令完成重命名和清理 sh hdfs dfs -mv /home/cloudera/Downloads/res_temp/part-r-00000 /home/cloudera/Downloads/res.csv; sh hdfs dfs -rm -r /home/cloudera/Downloads/res_temp;
注意:这种方法需要你拥有集群Shell环境的操作权限,确保执行时不会遇到权限问题。
最后再强调一次:一定要加上USING PigStorage(',')来指定逗号分隔符,否则生成的文件是制表符分隔的,不符合标准CSV格式要求。
内容的提问来源于stack exchange,提问作者mvk
相关产品推荐
相关产品推荐

