Presto SQL转Hive SQL时遭遇编译错误,请求适配解决方案
Presto SQL转Hive SQL时遭遇编译错误,请求适配解决方案
我明白你现在碰到的问题了——把Presto里拆分JSON数组的逻辑转到Hive时踩了坑,那个编译错误其实是因为你用错了函数组合,咱们一步步来修正:
错误原因分析
你用的json_tuple函数是用来提取单个JSON对象里的多个字段的,它返回的是多列结果而非数组类型,所以explode(UDTF函数)没法处理它,这才触发了UDTF's are not supported outside the SELECT clause, nor nested in expressions这个错误。
适配的Hive解决方案
根据你的数据结构,我们需要先把字符串类型的JSON数组解析成Hive能识别的数组结构,再拆分成行,最后提取每个JSON元素里的字段。这里分两种场景给出方案:
方案1:适用于Hive 2.3及以上版本(推荐)
Hive 2.3+支持from_json函数,可以直接将JSON字符串解析成指定结构的数组,写法更严谨:
SELECT id, get_json_object(item, '$.ticker') AS ticker, get_json_object(item, '$.name') AS name FROM stock_table -- 用from_json把字符串转成数组,再用lateral view explode拆分成行 LATERAL VIEW explode( from_json( items, -- 定义数组的结构:包含ticker和name两个字符串字段的结构体数组 'array<struct<ticker:string, name:string>>' ) ) t AS item;
方案2:适用于旧版本Hive(无from_json支持)
如果你的Hive版本较低,可以用正则拆分的方式处理JSON数组(注意:如果JSON元素里包含}, {这种字符,可能会有误差,适合结构规范的场景):
SELECT id, -- 给拆分后的元素补上前后的{},再提取字段 get_json_object(concat('{', item, '}'), '$.ticker') AS ticker, get_json_object(concat('{', item, '}'), '$.name') AS name FROM stock_table LATERAL VIEW explode( -- 先去掉数组的[],再按}, {拆分每个元素 split(regexp_replace(items, '^\\[|\\]$', ''), '},\\s*\\{') ) t AS item -- 过滤掉拆分后可能出现的空字符串 WHERE item != '';
效果验证
这两个方案都能输出你预期的结果:
| ID | ticker | name |
|---|---|---|
| 10 | TSLA | TESLA |
| 10 | SQ | BLOCK |
| 11 | AAPL | APPLE |
备注:内容来源于stack exchange,提问作者vvazza
相关产品推荐
相关产品推荐

