You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:37:49