Sql 配置单元-分解数组列并使用select语句错误的左联接或子查询
给出两个表格: 仅包含少量数据集的筛选_位置Sql 配置单元-分解数组列并使用select语句错误的左联接或子查询,sql,arrays,hadoop,hive,exploded,Sql,Arrays,Hadoop,Hive,Exploded,给出两个表格: 仅包含少量数据集的筛选_位置 |-------------| | loc<String> | |-------------| | ... | |-------------| 我想查询table_clients以获取筛选的_位置上的值。 主要问题是,要查询的表\客户端字段是数组类型 因此,我分解了该列,然后尝试嵌入一个子查询,以仅包括筛选出的位置中列出的位置 我面临的第一个问题是,配置单元(至少我正在运行的版本)似乎不接受in或exists语句
|-------------|
| loc<String> |
|-------------|
| ... |
|-------------|
我想查询table_clients以获取筛选的_位置上的值。
主要问题是,要查询的表\客户端字段是数组类型
因此,我分解了该列,然后尝试嵌入一个子查询,以仅包括筛选出的位置中列出的位置
我面临的第一个问题是,配置单元(至少我正在运行的版本)似乎不接受in或exists语句中的子查询
这就是我得到的错误:
编译语句时出错:失败:SemanticException无效
子查询sq_1定义中的列引用“location”[
tc.location(从过滤的位置fl]中选择fl.loc)用作
sq_1
作为一种替代方法,我尝试使用左连接,但由于explode调用,因此也不起作用
第二个错误
编译语句时出错:失败:SemanticException[错误]
10085]:不支持与侧视图连接“位置”
那么,我的问题的最佳解决方案是什么?请注意,table_客户端有数百万条记录
谢谢理论上,这应该是有效的
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)
;
没有tc.location,有l.location非常大的表格行吗?严重?tc.location是tc.locations数组列的分解列。你不认为这个故事大吗?1不,爆炸关系别名是L,所以它是L.Load 2本地数据库SQL Server、PostgreSQL、Oracle等,安装在标准的个人计算机上,每秒处理数以百万计的记录。你不会为了数百万条记录进入蜂巢。这个表有数百万条记录,无论如何,即使l.location也不起作用。首先阅读错误是的,这也是我的解决方案。我担心的是,由于table_客户机很大,我只需要过滤一些记录,所以这种方法有点慢,但很好,它可以工作:。删除子查询并不一定意味着有额外的步骤。这就是优化器的用途。你认为select*fromselect*fromselect*fromselect*fromselect*和ttttt之间有区别吗;然后从t中选择*嗯,我明白了。因此,在select*from clients和explode之后使用子查询不会对性能造成太大损失?谢谢你提起这件事。实际上,我不太了解SQL引擎如何优化查询。德克萨斯州
select *
from table_clients c
lateral view explode(location) e as loc
where e.loc in (select l.loc from filtered_locations l)
;
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)
;