【问题标题】:HIVE string searchHIVE 字符串搜索
【发布时间】:2015-07-24 20:59:31
【问题描述】:

我正在尝试在 hive 中查询数据(将其视为表中具有长字符串的列)。具体要求是过滤具有模式的字符串。

example string1: "Some content. AB: xyz-p1 CD: rst-p1"

example string2: "Some content. AB: xyz-p2 CD: rst-p2"

example string3: "Some content. AB: xyz-p1 CD: xyz-p1"

example string4: "Some content. AB: xyz-p2 CD: xyz-p2"

(p1 和 p2 是模式,可以将它们视为字符串。AB: 和 CD: 是固定(常量)字符串。xyz 和 rst 也是字符串而不是常量)

我要求 string1 和 string2 应该是 hive 查询结果的一部分,而不是 string3 和 string4。更正式地说,字符串 AB 和 CD 后面不能跟随相同的模式(xyz 或 rst)。

我最初的尝试是这样的:-

select * from tableName where (col1 like '%AB: %-p1%' or col1 like '%CD: %-p2%') 
and (col1 not like '%AB: %-p1%') and (col2 not like '%CD: %-p2%')

但是这似乎没有给出预期的结果。

【问题讨论】:

    标签: hive where-clause


    【解决方案1】:

    使用正则表达式提取两个字段,然后您可以简单地比较它们。使用正则表达式提取字段的示例,我已经测试过它的工作原理:

    Select 
     regexp_extract('Some content. AB: xyz-p1 CD: rst-p1','^.*AB:\\s(.*)\\sCD:.*',1) 
       AS pattern1,
     regexp_extract('Some content. AB: xyz-p1 CD: rst-p1','^.*CD:\\s(.*)',1) 
       AS pattern2;
    

    您的完整查询应该类似于(未经测试):

    Select * FROM tablename
    WHERE regexp_extract(col1,'^.*AB:\\s(.*)\\sCD:.*',1)  <> regexp_extract(col1,'^.*CD:\\s(.*)',1) ;
    

    有关 regexp_extract 函数的更多信息,请查看此处https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-StringFunctions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多