hive-explode数组列并使用带有select语句错误的左联接或子查询

qxgroojn  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(363)

给出两张表: filtered_locations 包含小数据集(只有几行)

|-------------|
| loc<String> | 
|-------------|
|     ...     |
|-------------|
``` `table_clients` 超大表(百万行)
idnameagelocations <array
-------------------------------------------
[a,b,c..]
--------------------------------------------
我想查询表 `table_clients` 对于上的值 `filtered_locations` . 主要问题是要查询的字段 `table_clients` 是一个 `array` 类型。
所以,我分解了列,然后尝试嵌入一个子查询,只包含列中列出的位置 `filtered_locations` .
我面临的第一个问题是,配置单元(至少是我正在运行的版本)似乎不接受内部的子查询 `in` 或者 `exists` 站着。
这就是我得到的错误:
编译语句时出错:失败:semanticexception子查询sq_1[tc.location in(select fl.loc from filtered_locations fl)]的定义中的列引用'location'无效,用作sq_1
作为替代,我试着用 `LEFT JOIN` 但也不工作,因为 `explode` 呼叫第二个错误
编译语句时出错:失败:semanticexception[error 10085]:不支持带有横向视图的联接“location”

with filtered_locations as (
SELECT
'loc1' as loc
union all
'loc2' as loc
)

select
id, name, location
max(age) as max_age
from
table_clients tc
LATERAL VIEW EXPLODE(locations) l as location
-- Ideally this should work!
-- where
-- tc.location in (
-- select fl.loc from filtered_locations fl
-- )
left join filtered_locations fl
on fl.loc = tc.location

group by id, name, location

那我的问题最好的解决办法是什么呢?请注意 `table_clients` 有数百万张唱片!
谢谢
kgsdhlau

kgsdhlau1#

从理论上说,这应该管用

select  *

from    table_clients c
        lateral view explode(location) e as loc

where   e.loc in (select l.loc from filtered_locations l)
;

失败:semanticexception[错误10009]:行6:8表别名“e”无效
... 但既然没有,就需要一点变通

select  *

from   (select  *

        from    table_clients c
                lateral view explode(location) e as loc
        ) c        

where   c.loc in (select l.loc from filtered_locations l)
;

相关问题