Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 配置单元-分解数组列并使用select语句错误的左联接或子查询_Sql_Arrays_Hadoop_Hive_Exploded - Fatal编程技术网

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)
;