在Hive写入表时,能否调用刚生成的字段创建新字段变量?
在Hive中引用刚生成的字段创建新字段的解决方案
嘿,我来帮你搞定这个Hive的字段引用问题!首先得明确一个关键点:在同一个SELECT子句里,你没法直接引用刚刚生成的字段别名(比如你这里的MBR_DRVD),因为Hive解析SELECT子句的时候,是先处理所有表达式,再给字段分配别名的,所以当你在第二个CASE WHEN里想用MBR_DRVD时,这个别名还没生效呢。
不过别担心,有几种实用的方法能解决这个问题,我结合你的代码片段给你逐一说明:
方法1:重复字段生成表达式
这是最直接(虽然有点冗余)的方式,把生成MBR_DRVD的整个表达式直接复制到第二个CASE WHEN里,替换你代码里的*****部分:
SELECT CASE WHEN Substr(Upper(Trim(MBRCHR)),-3) rlike '[8-9][0-9][A-E]' THEN Substr(Upper(trim(regexp_replace(MBRCHR,'[^0-9]',''))),1,Length(Upper(Trim(regexp_replace(MBRCHR,'[^0-9]',''))))-2) ELSE Upper(trim(regexp_replace(MBRCHR,'[^0-9]+',''))) END as MBR_DRVD, CASE WHEN Length( -- 直接重复MBR_DRVD的生成逻辑 CASE WHEN Substr(Upper(Trim(MBRCHR)),-3) rlike '[8-9][0-9][A-E]' THEN Substr(Upper(trim(regexp_replace(MBRCHR,'[^0-9]',''))),1,Length(Upper(Trim(regexp_replace(MBRCHR,'[^0-9]',''))))-2) ELSE Upper(trim(regexp_replace(MBRCHR,'[^0-9]+',''))) END ) between 7 and 9 THEN -- 这里填写你要执行的逻辑 '符合长度要求的处理结果' ELSE -- 其他情况的处理逻辑 '不符合的处理结果' END as NEW_FIELD FROM your_table_name;
方法2:使用子查询
把生成MBR_DRVD的逻辑放到子查询里,在外层查询就可以直接引用这个别名了,可读性会好很多:
SELECT MBR_DRVD, CASE WHEN Length(MBR_DRVD) between 7 and 9 THEN '符合长度要求的处理结果' ELSE '不符合的处理结果' END as NEW_FIELD FROM ( SELECT CASE WHEN Substr(Upper(Trim(MBRCHR)),-3) rlike '[8-9][0-9][A-E]' THEN Substr(Upper(trim(regexp_replace(MBRCHR,'[^0-9]',''))),1,Length(Upper(Trim(regexp_replace(MBRCHR,'[^0-9]',''))))-2) ELSE Upper(trim(regexp_replace(MBRCHR,'[^0-9]+',''))) END as MBR_DRVD FROM your_table_name ) temp_table;
方法3:使用CTE(公共表表达式)
如果你的逻辑比较复杂,用CTE会让代码结构更清晰,和子查询原理类似,但可读性更强:
WITH temp_cte AS ( SELECT CASE WHEN Substr(Upper(Trim(MBRCHR)),-3) rlike '[8-9][0-9][A-E]' THEN Substr(Upper(trim(regexp_replace(MBRCHR,'[^0-9]',''))),1,Length(Upper(Trim(regexp_replace(MBRCHR,'[^0-9]',''))))-2) ELSE Upper(trim(regexp_replace(MBRCHR,'[^0-9]+',''))) END as MBR_DRVD FROM your_table_name ) SELECT MBR_DRVD, CASE WHEN Length(MBR_DRVD) between 7 and 9 THEN '符合长度要求的处理结果' ELSE '不符合的处理结果' END as NEW_FIELD FROM temp_cte;
个人更推荐用子查询或者CTE的方式,尤其是当你的字段生成逻辑很复杂的时候,能避免重复写大量代码,也方便后续维护。
内容的提问来源于stack exchange,提问作者Wesley Kluckhohn
相关产品推荐
相关产品推荐

