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

PIG CASE语句报错求助:生成vertex_code时类型不兼容问题

解决Pig脚本中类型不兼容及CASE条件错误的问题

你的Pig脚本遇到了几个典型的语法和类型匹配问题,我来帮你逐一梳理并修正:

错误原因拆解

  1. 类型不匹配:SUBSTRING(geocode,0,2)返回的是chararray类型,但你直接和整数(比如00-51里的数值)做比较,Pig无法自动完成类型转换,因此抛出incompatible types错误。
  2. CASE条件写法错误:Pig的CASE WHEN不支持WHEN 00-51这种范围简写,必须用比较运算符(>=、<=)来明确区间判断逻辑。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:50:57