Pig中使用三元运算符生成CD_MARCHE报错的解决方法咨询
解决Pig中嵌套三元运算符的语法报错问题
这个问题我之前帮人排查过,Pig对嵌套三元运算符的括号结构要求特别严格,咱们一步步来解决:
报错原因分析
你原来的写法里,内层的三元表达式没有用括号完整包裹,Pig的语法解析器没法正确识别每个?和:的对应关系。当它读到第二个?的时候,误以为前面的表达式已经该结束了,所以抛出了mismatched input '?' expecting RIGHT_PAREN这个括号不匹配的错误。
修正后的代码
只需要把每个内层的三元运算符都用括号包裹起来,让每个分支都是一个完整的表达式即可。你可以选择换行让结构更清晰:
(CD_AXE_MCH IN ('PLIB','ATPE','COMM') ? 'P' : (CD_AXE_MCH == 'PME' ? 'E' : (CD_AXE_MCH == 'AGRI' ? 'A' : (CD_AXE_MCH == 'OBNL' ? 'O' : (CD_AXE_MCH == 'COLL' ? 'C' : (CD_AXE_MCH == 'EFIN' ? 'B' : 'X'))))) AS CD_MARCHE
如果需要写成一行,保证括号正确即可:
(CD_AXE_MCH IN ('PLIB','ATPE','COMM') ? 'P' : (CD_AXE_MCH == 'PME' ? 'E' : (CD_AXE_MCH == 'AGRI' ? 'A' : (CD_AXE_MCH == 'OBNL' ? 'O' : (CD_AXE_MCH == 'COLL' ? 'C' : (CD_AXE_MCH == 'EFIN' ? 'B' : 'X'))))) AS CD_MARCHE
逻辑验证
修改后的代码逻辑和你原本的需求完全一致:
- 当
CD_AXE_MCH属于('PLIB','ATPE','COMM')时,CD_MARCHE为'P' - 依次匹配后续的单个值,返回对应的标识
- 所有条件都不满足时返回
'X'
这样调整后,Pig就能正确解析嵌套的三元运算符,不会再抛出语法错误了。
内容的提问来源于stack exchange,提问作者SA2018
相关产品推荐
相关产品推荐

