PIG CASE语句报错求助:生成vertex_code时类型不兼容问题
解决Pig脚本中类型不兼容及CASE条件错误的问题
你的Pig脚本遇到了几个典型的语法和类型匹配问题,我来帮你逐一梳理并修正:
错误原因拆解
- 类型不匹配:
SUBSTRING(geocode,0,2)返回的是chararray类型,但你直接和整数(比如00-51里的数值)做比较,Pig无法自动完成类型转换,因此抛出incompatible types错误。 - CASE条件写法错误:Pig的
CASE WHEN不支持WHEN 00-51这种范围简写,必须用比较运算符(>=、<=)来明确区间判断逻辑。 - CONCAT函数误用:你把
CONCAT(01,CONCAT(geocode,00))当成字符串字面量返回了,而不是实际调用Pig的CONCAT函数来执行字符串拼接操作。
修正后的Pig脚本
-- 加载原始数据,保持原有字段定义 item = load '/user/item.txt' USING PigStorage('|') AS (load_id:chararray, record_type:chararray, geocode:chararray); -- 正确生成vertex_code字段 newitem = FOREACH item GENERATE load_id, record_type, ( -- 先将geocode前两位转为整数,方便范围判断 LET geo_prefix = INT(SUBSTRING(geocode, 0, 2)), vertex_prefix = ( CASE geo_prefix WHEN 70 THEN '03' WHEN x WHERE x >= 61 AND x <=78 THEN '04' WHEN x WHERE x >= 0 AND x <=51 THEN '01' ELSE '00' END ) -- 嵌套调用CONCAT完成最终字符串拼接 CONCAT(CONCAT(vertex_prefix, geocode), '00') AS vertex_code ); -- 输出结果验证 DUMP newitem;
关键修正点说明
- 类型统一:用
INT(SUBSTRING(geocode, 0, 2))将geocode前两位的字符串转为整数,确保数值比较的类型兼容性。 - 区间判断语法:使用
WHEN x WHERE x >=N AND x <=M的语法定义范围条件,同时把特殊值70放在前面,避免被后续范围条件覆盖。 - 正确调用拼接函数:先通过变量定义前缀,再用嵌套的
CONCAT函数把前缀、原始geocode、后缀00拼接成最终的vertex_code,确保执行的是函数逻辑而非返回字符串文本。
测试你给出的示例:当geocode=44556677时,前两位44属于0-51区间,前缀为01,最终生成的vertex_code就是014455667700,完全符合需求。
内容的提问来源于stack exchange,提问作者Roho
相关产品推荐
相关产品推荐

