hive:Map的过滤器数组

c3frrgcw  于 2021-06-25  发布在  Hive
关注(0)|答案(0)|浏览(276)

我有一个配置单元表列作为

col1                array<map<string,string>>

此列包含以下值:

[
    {'a':1,'b':2},
    {'a':1,'c':3},
    .
    .
    .
]

现在,内部Map中的键可以根据每个项目而变化。我想过滤数组,以便只获取 b 存在。这样的事情能用计算机来实现吗 array_contains ? 我试过了,但我错了

select col1 from mytab where size(col1) > 0 and array_contains(col1, 'b');
FAILED: SemanticException [Error 10016]: Line 1:196 Argument type mismatch ''b'': "map<string,string>" expected at function ARRAY_CONTAINS, but "string" is found

很明显,但我还是试过了。
更新
我试过了

select res from mytab LATERAL VIEW EXPLODE (col1) c as res where 
 size(col1) > 0 and res is not NULL and length(res) > 0;

为此我得到

{}
{a=1, b=2}
{a=1, b=2}
{}

这是好的,但我如何才能避免空洞的结果,即。 {} ?
更新2
我可以删除空的结果

select res from mytab LATERAL VIEW EXPLODE (col1) c as res where 
     size(col1) > 0 and res['b'] is not NULL and length(res['b']) > 0 res <> '{}';

最后一个问题是,如何转换 res 从字符串到正确的Map?我想有一些地方的条件,使用密钥在res。我试过了

select str_to_map(res) as st from mytab LATERAL VIEW EXPLODE (col1) c as res where 
         size(col1) > 0 and res is not NULL and length(res) > 0 res <> '{}';

但我明白了

{"{a=1, b=2}":null}

我怎样才能得到一张合适的Map?我只想用Map的键过滤。现在这个Map被选为一个字符串

select res['b'] from mytab LATERAL VIEW EXPLODE (col1) c as res where 
     size(col1) > 0 and res['b'] is not NULL and length(res) > 0 res['b'] <> '{}' and res['b']=1;

但我明白了
失败:semanticexception[error 10033]:行1:237[]对非集合类型“b”无效:string

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题