对于hive的复杂结构数据类型,如何使用where子句编写查询

2vuwiymt  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(510)

我有下面的配置单元表和复杂的数据类型struct。你能帮我写一个特定城市的带有where子句的配置单元查询吗?

  1. CREATE EXTERNAL TABLE user_t (
  2. name STRING,
  3. id BIGINT,
  4. isFTE BOOLEAN,
  5. role VARCHAR(64),
  6. salary DECIMAL(8,2),
  7. phones ARRAY<INT>,
  8. deductions MAP<STRING, FLOAT>,
  9. address ARRAY<STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>>,
  10. others UNIONTYPE<FLOAT,BOOLEAN,STRING>,
  11. misc BINARY
  12. )

我可以在select子句中使用struct数据类型,但不能在where子句中使用相同的数据类型。
工作:

  1. select address.city from user_t;

不工作:

  1. select address.city from user_t where address.city = 'XYZ'

文档说明它在使用groupby或where子句时有局限性,并给出了解决方案。但我不太明白。
链接:文档
请建议。谢谢您。

gorkyyrv

gorkyyrv1#

演示

  1. create table user_t
  2. (
  3. id bigint
  4. ,address array<struct<street:string, city:string, state:string, zip:int>>
  5. )
  6. ;
  7. insert into user_t
  8. select 1
  9. ,array
  10. (
  11. named_struct('street','street_1','city','city_1','state','state_1','zip',11111)
  12. ,named_struct('street','street_2','city','city_1','state','state_1','zip',11111)
  13. ,named_struct('street','street_3','city','city_3','state','state_3','zip',33333)
  14. )
  15. union all
  16. select 2
  17. ,array
  18. (
  19. named_struct('street','street_4','city','city_4','state','state_4','zip',44444)
  20. ,named_struct('street','street_5','city','city_5','state','state_5','zip',55555)
  21. )
  22. ;

选项1:分解

  1. select u.id
  2. ,a.*
  3. from user_t as u
  4. lateral view explode(address) a as details
  5. where details.city = 'city_1'
  6. ;
  1. +----+---------------------------------------------------------------------+
  2. | id | details |
  3. +----+---------------------------------------------------------------------+
  4. | 1 | {"street":"street_1","city":"city_1","state":"state_1","zip":11111} |
  5. | 1 | {"street":"street_2","city":"city_1","state":"state_1","zip":11111} |
  6. +----+---------------------------------------------------------------------+

选项2:内联

  1. select u.id
  2. ,a.*
  3. from user_t as u
  4. lateral view inline(address) a
  5. where a.city = 'city_1'
  6. ;
  1. +----+----------+--------+---------+-------+
  2. | id | street | city | state | zip |
  3. +----+----------+--------+---------+-------+
  4. | 1 | street_1 | city_1 | state_1 | 11111 |
  5. | 1 | street_2 | city_1 | state_1 | 11111 |
  6. +----+----------+--------+---------+-------+

选项3:自连接

  1. select u.*
  2. from user_t as u
  3. join (select distinct
  4. u.id
  5. from user_t as u
  6. lateral view inline(address) a
  7. where a.city = 'city_1'
  8. ) as u2
  9. on u2.id = u.id
  10. ;
  1. +----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  2. | id | address |
  3. +----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  4. | 1 | [{"street":"street_1","city":"city_1","state":"state_1","zip":11111},{"street":"street_2","city":"city_1","state":"state_1","zip":11111},{"street":"street_3","city":"city_3","state":"state_3","zip":33333}] |
  5. +----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
展开查看全部

相关问题