Apache Pig加载多级JSON文件并导出为CSV失败的问题排查及存储命令验证
解决Apache Pig加载多级JSON及路径错误、CSV导出问题
你在处理多级JSON加载到Pig时遇到了路径错误、嵌套字段解析以及CSV导出验证的问题,下面逐一帮你解决:
一、解决"Input path does not exist"路径错误
你看到的错误提示ERROR 2118: Input path does not exist: hdfs://spam-ham-m/home/vikaspattathe/dataset/sample.json,核心原因是Pig默认从HDFS(Hadoop分布式文件系统)读取文件,但你的JSON存放在本地磁盘。有两种解决方式:
方法1:将本地文件上传到HDFS
在终端执行HDFS命令完成上传:
hdfs dfs -put /home/vikaspattathe/dataset/sample.json /home/vikaspattathe/dataset/
上传后直接使用原LOAD路径即可。
方法2:直接加载本地文件(指定本地路径前缀)
修改LOAD命令,在路径前添加file://前缀,明确告诉Pig读取本地磁盘的文件:
sample_table = LOAD 'file:///home/vikaspattathe/dataset/sample.json' USING JsonLoader(...);
二、正确加载多级JSON数据
你的JSON包含嵌套字段_id:{"$oid":"xxx"},但原LOAD命令里的id:chararray无法解析嵌套结构,即使路径问题解决后也会出现字段值为空的情况,需要调整字段定义:
方式1:用Map类型解析嵌套字段
把_id定义为Map类型,后续可提取$oid的值:
sample_table = LOAD 'file:///home/vikaspattathe/dataset/sample.json' USING JsonLoader( '_id:map[chararray], reviewerID:chararray, asin:chararray, reviewerName:chararray, helpful:tuple(int,int), reviewText:chararray, overall:float, summary:chararray, unixReviewTime:long, reviewTime:chararray, category:chararray, class:float' );
如果需要单独提取$oid作为独立字段,可通过FOREACH语句处理:
cleaned_table = FOREACH sample_table GENERATE _id#'$oid' AS id:chararray, reviewerID, asin, reviewerName, helpful, reviewText, overall, summary, unixReviewTime, reviewTime, category, class;
方式2:直接指定嵌套字段路径
JsonLoader支持用.定位嵌套字段,直接将_id.$oid作为字段名:
sample_table = LOAD 'file:///home/vikaspattathe/dataset/sample.json' USING JsonLoader( '_id.$oid:chararray AS id, reviewerID:chararray, asin:chararray, reviewerName:chararray, helpful:tuple(int,int), reviewText:chararray, overall:float, summary:chararray, unixReviewTime:long, reviewTime:chararray, category:chararray, class:float' );
这样加载后,id字段就直接对应_id内的$oid值。
另外要注意几个细节:
overall和class在JSON中是浮点型(如5.0),原LOAD命令里的int类型会导致解析错误,需改为floatunixReviewTime是时间戳,定义为long类型更合适helpful是数组结构,用tuple(int,int)可以准确匹配其两个元素
三、验证CSV导出命令的正确性
你准备的STORE命令是正确的:
STORE sample_table INTO '/home/vikaspattathe/dataset/samplecsv' USING PigStorage(',');
但有几个注意点:
- 如果要导出到本地磁盘,同样需要添加
file://前缀,否则会默认保存到HDFS - 若字段(如
reviewText)包含逗号,导出的CSV会出现格式混乱,可换成其他分隔符(如PigStorage('\t')),或提前对字段内的逗号做替换处理 - 执行命令后,目标目录
samplecsv会自动创建,输出的CSV内容会分散在多个part-r-xxxx文件中
内容的提问来源于stack exchange,提问作者Vikas Palakkat
相关产品推荐
相关产品推荐

