Pig脚本过滤无结果求助:Hadoop环境下CSV数据处理问题
排查Pig脚本无结果输出的问题
作为Hadoop新手遇到这种情况很常见,咱们一步步来拆解可能的原因:
分隔符不匹配(最可能的核心问题)
你提到数据是CSV格式,但脚本里用的是PigStorage('\t')加载数据——CSV默认是逗号分隔,而非制表符。如果数据实际用逗号分隔,Pig会把整行内容当成一个字段,此时$5(第6个字段,索引从0开始)要么不存在,要么根本不是你期望的Arrest字段值,过滤自然返回空结果。
建议先修改加载语句的分隔符:LoadHomicide = LOAD '/user/admin/Crimes_samples.csv' USING PigStorage(',') AS (Date:chararray,Block:chararray,PrimaryType:chararray, Description:chararray, LocationDescription:chararray,Arrest:chararray,Domestic:chararray,District:chararray,Year:chararray);要是不确定分隔符,可用HDFS命令查看原始数据:
hdfs dfs -cat /user/admin/Crimes_samples.csv | head -5验证字段加载是否正确映射
在执行过滤前,先直接输出加载后的数据集,确认字段结构是否符合预期:dump LoadHomicide;看看每条记录的字段数量、内容是否和你定义的
AS结构一致。比如如果分隔符错误,所有数据会挤在第一个字段里,后面的字段都是空值,$5自然不会有FALSE这类值。检查
Arrest字段的实际值格式
脚本里用$5 matches'%FALSE%'匹配,但实际数据里的Arrest值可能有格式差异:- 比如是小写的
false而非大写FALSE - 或者带有前后空格,比如
' FALSE'或'FALSE ' - 甚至用
'NO'这类值表示未逮捕状态
你可以先查看Arrest字段的所有唯一取值:
arrest_values = FOREACH LoadHomicide GENERATE Arrest; distinct_arrest = DISTINCT arrest_values; dump distinct_arrest;根据实际结果调整过滤条件,比如改成
LOWER($5) matches'%false%'忽略大小写,或者直接匹配实际存在的值。- 比如是小写的
确认数据源是否有效
虽然脚本没报错,但要确认目标文件是否真实存在且有数据:- 用HDFS命令检查文件状态:
hdfs dfs -ls /user/admin/Crimes_samples.csv,看文件大小是否大于0 - 查看文件内容片段:
hdfs dfs -cat /user/admin/Crimes_samples.csv | head,确认里面有实际的犯罪记录数据
- 用HDFS命令检查文件状态:
按照上面的步骤逐一排查,应该能快速定位问题。
内容的提问来源于stack exchange,提问作者aristide
相关产品推荐
相关产品推荐

