Pig Dump输出未显示全部数字,数据疑似被百万倍截断问题求助
解决Pig加载CSV后人口数据被截断的问题
嘿,我来帮你搞定这个问题!你看到的“数据疑似被除以一百万”其实不是真的除法,而是数据被错误分割截断了——控制台里的"39其实是原始数字39144818的前两位,问题出在CSV的格式和你用的加载方式上。
问题根源
你的原始CSV里的人口数字大概率带有千位分隔符逗号(比如写成了"39,144,818"),而你用PigStorage(',')加载时,会把所有逗号都当成字段分隔符。这样一来,California,"39,144,818"会被拆成三个字段:California、"39、144,你只取了前两个字段,所以就出现了(California,"39)的奇怪输出。
解决方案
这里给你三个可行的解决办法,你可以根据自己的环境选择:
1. 使用专门的CSV加载器(推荐)
Pig的piggybank工具包里有CSVLoader,它能自动处理带引号的字段和字段内的逗号,完美适配标准CSV格式。
首先确保你的环境里有piggybank.jar(通常Pig安装目录下的lib文件夹里就有),然后用以下代码加载:
-- 注册piggybank jar包(如果环境没默认加载的话) REGISTER piggybank.jar; statePopFile = LOAD 'hdfs:/home/ubuntu/final/gunData/statePops.csv' USING org.apache.pig.piggybank.storage.CSVLoader(','); stateRec = FOREACH statePopFile GENERATE $0 AS state, $1 AS population; DUMP stateRec;
2. 手动清理数据后拆分
如果没法用CSVLoader,可以先读取整行数据,去掉引号和数字里的千位分隔符,再拆分字段:
-- 按整行读取原始文件 statePopFile = LOAD 'hdfs:/home/ubuntu/final/gunData/statePops.csv' AS line:chararray; -- 清理并拆分数据 stateRec = FOREACH statePopFile { -- 去掉所有双引号 cleaned_line = REPLACE(line, '"', ''); -- 去掉数字中的千位分隔符逗号 cleaned_line = REPLACE(cleaned_line, '(\\d),(\\d)', '$1$2'); -- 按逗号拆分,只拆成2个字段(避免干扰) split_line = STRSPLIT(cleaned_line, ',', 2); GENERATE split_line.$0 AS state, split_line.$1 AS population; } DUMP stateRec;
3. 预处理CSV文件
先在HDFS上用命令行工具清理掉数字里的千位分隔符,再用你原来的代码加载:
-- 读取原始文件,清理千位分隔符,保存为新文件 hdfs dfs -cat /home/ubuntu/final/gunData/statePops.csv | sed 's/\([0-9]\),\([0-9]\)/\1\2/g' > cleaned_statePops.csv -- 将清理后的文件上传回HDFS hdfs dfs -put cleaned_statePops.csv /home/ubuntu/final/gunData/
之后用你原来的Pig代码加载cleaned_statePops.csv即可。
验证步骤
你可以先查看原始CSV的真实内容,确认是不是带千位分隔符:
hdfs dfs -cat /home/ubuntu/final/gunData/statePops.csv
这样就能100%确认问题根源啦!
内容的提问来源于stack exchange,提问作者zac s
相关产品推荐
相关产品推荐

