【问题标题】:Using like operator against STRUCT data type对 STRUCT 数据类型使用 like 运算符
【发布时间】:2021-07-13 17:03:22
【问题描述】:

我有一个包含结构数组的表。有没有办法使用 like 运算符过滤此列中的记录?

hive> desc location;
location_list           array<struct<city:string,state:string>>

hive> select * from location;
row1 : [{"city":"Hudson","state":"NY"},{"city":"San Jose","state":"CA"},{"city":"Albany","state":"NY"}]
row2 : [{"city":"San Jose","state":"CA"},{"city":"San Diego","state":"CA"}]

我正在尝试运行类似这样的查询,以仅过滤那些具有“NY”状态的记录。

hive> select * from location where location_list like '%"NY"%';
FAILED: SemanticException [Error 10014]: Line 1:29 Wrong arguments ''%"NY"%'': No matching method for class org.apache.hadoop.hive.ql.udf.UDFLike with (array<struct<city:string,state:string>>, string). Possible choices: _FUNC_(string, string)

注意:我可以通过对这个结构列进行横向视图和分解来做到这一点。但尽量避免它,因为我需要将此表与另一个不接受横向视图的表连接起来。

【问题讨论】:

    标签: sql arrays struct hive hiveql


    【解决方案1】:

    好问题,您可以通过以下高效(且美观)的方式来解决问题。

    select * from location 
    where array_contains(location_list.state, 'NY');
    

    在这种情况下,location_list.state 将创建一个字符串数组(在您的情况下为状态),因此您可以使用 UDF array_contains 进行值检查。这将寻找确切的值,您将无法执行像 like 运算符这样的匹配,但您应该能够实现您正在寻找的内容

    【讨论】:

      【解决方案2】:

      array_contains的演示:

      select my_array  
      from
      ( --emulation of your dataset. Just replace this subquery with your table
       select array(named_struct("city","Hudson","state","NY"),named_struct("city","San Jose","state","CA"),named_struct("city","Albany","state","NY")) as my_array
       union all
       select array(named_struct("city","San Jose","state","CA"),named_struct("city","San Diego","state","CA")) as my_array
      )s
      where array_contains(my_array.state,'NY') 
      ;
      

      结果:

      OK
      [{"city":"Hudson","state":"NY"},{"city":"San Jose","state":"CA"},{"city":"Albany","state":"NY"}]
      Time taken: 34.055 seconds, Fetched: 1 row(s)
      

      【讨论】:

        猜你喜欢
        • 2020-07-15
        • 2017-02-11
        • 2020-11-19
        • 2011-07-07
        • 2017-03-06
        • 2011-07-08
        • 1970-01-01
        • 2015-04-10
        • 1970-01-01
        相关资源
        最近更新 更多