【问题标题】:Extract map(varchar, array(varchar)) - Hive SQL提取 map(varchar, array(varchar)) - Hive SQL
【发布时间】:2021-10-27 19:10:56
【问题描述】:

我有一个我认为包含 json 字符串的字段

示例:{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}

如何过滤颜色 = 蓝色的记录?

【问题讨论】:

    标签: sql arrays json hive hiveql


    【解决方案1】:

    在对@GordonLinoff 答案的评论中,您提到了presto 错误。如果您使用 Presto,请使用这些配方,另请参阅下面的 Hive 解决方案:

    如果数据类型是JSON字符串,可以强制转换为map(varchar, array(varchar)),然后使用where contains(map['color'],'blue')进行过滤:

    select * 
    from
    (--cast JSON string as MAP(VARCHAR,ARRAY(VARCHAR)) 
    select '{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}' as original_string,
           CAST(JSON '{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}' AS MAP(VARCHAR,ARRAY(VARCHAR)) ) as mymap
    )s
    where contains(mymap['color'],'blue')
    

    结果:

        original_string                                            mymap    
    {"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}    {'color': ['blue'], 'fruit': ['apple', 'cherry', 'banana']}
    

    另一种方法是使用json_parse + json_extract + json_array_contains

    select *
    from
    (--Parse JSON 
    select '{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}' as original_string,
          json_parse( '{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}' ) as myjson
    )s
    WHERE json_array_contains(json_extract(myjson, '$.color'),'blue')
    

    结果:

        original_string                                            myjson
    {"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}    {'color': ['blue'], 'fruit': ['apple', 'cherry', 'banana']}
    

    如果数据类型已经是map(varchar, array(varchar)),那么只需使用contains(field['color'],'blue')

    如果使用 Hive SQL,则使用 get_json_object 提取颜色数组(get_json_object 始终返回字符串),删除双引号和方括号,拆分以获取数组并使用 array_contains 检查:

    WHERE array_contains(split(regexp_replace(get_json_object(field,'$.color'),'"|^\\[|\\]$',''),','),'blue')
    

    如果你使用 Hive 并且字段是 map<string,array<string>> 类型,使用这个:

    array_contains(field['color'],'blue')
    

    【讨论】:

      【解决方案2】:

      嗯,你可以使用like:

      where field like '%"color":["blue"]%'
      

      这会在字符串中查找该模式。

      【讨论】:

      • 它不是一个常规字符串,所以我会得到这样的错误:presto error: line 4:5: Left side of LIKE expression must evaluate to a varchar (actual: map(varchar, array( varchar)))
      • @CuriousCat 是 hive 还是 Presto?如果是 Presto,请添加 Presto 标签
      • @CuriousCat 。 . . Hive 不返回“presto”错误。这个问题有问题。
      猜你喜欢
      • 2020-01-18
      • 2019-12-17
      • 2019-08-12
      • 1970-01-01
      • 2017-12-19
      • 2015-05-12
      • 2011-01-11
      • 1970-01-01
      • 2022-11-01
      相关资源
      最近更新 更多