【问题标题】:Hive query with multiple LIKE operators具有多个 LIKE 运算符的 Hive 查询
【发布时间】:2015-11-10 09:25:15
【问题描述】:

使用多个 LIKE 运算符编写 Hive 查询的正确方法是:

SELECT * 
FROM some_table
WHERE
some_col LIKE '%abc%'
OR
some_col LIKE '%xyz%'
OR
some_col LIKE '%pqr%'
OR
... (some more LIKE statements)

我也尝试过上述方法

WHERE some_col LIKE '%abc|pqr|xyz%' 

但他们没有返回任何结果。如果我编写单独的查询,它工作正常,即

WHERE some_col LIKE '%abc%' -> returns results

和

WHERE some_col LIKE '%pqr%' -> also returns results

【问题讨论】:

  • Hive 没有充分的理由在处理由 OR 组合的多个 LIKE 表达式时失败。您能否详细说明表类型(外部与托管、分区与否,文本与 RCFile 与 Orc 与其他)和列定义(纯字符串?那里有任何 Null 值吗?)
  • WHERE some_col rlike 'abc|pqr|xyz' 工作。

标签: hive sql-like


【解决方案1】:

来自文档:

一个喜欢 B

如果 A 或 B 为 NULL,则为 NULL,如果 A 的任何(可能为空)子字符串,则为 TRUE 匹配 Java 正则表达式 B,否则为 FALSE。例如, 'foobar' RLIKE 'foo' 评估为 TRUE,'foobar' RLIKE 也是如此 '^f.*r$'.


一个正则表达式 B

与 RLIKE 相同。

所以,使用

WHERE some_col RLIKE 'abc|pqr|xyz' 

【讨论】:

  • 谢谢@mattinbits!它可以工作并且能够编写干净的代码
【解决方案2】:

你或许可以使用 rlike(regular_expression)。

WHERE some_col RLIKE '*abc*|*pqr*|*xyz*' 

【讨论】:

  • 这是我尝试过但没有得到结果的方法。您是否建议我尝试 WHERE some_col RLIKE '%abc|pqr|xyz%'
  • 是的,尝试使用 rlike 作为正则表达式。很抱歉打字错误。我已经编辑了答案。
  • 对我不起作用。我认为应该是:WHERE some_col RLIKE 'abc|pqr|xyz'
  • 感谢您的指点。早些时候我在尝试column RLIKE '*abc*' OR column RLIKE '*pqr*' OR column RLIKE '*xyz*' 但这对处理来说非常繁重。但是,如果我按照提到的 int eh 解决方案,它工作正常。对此的任何解释都会有所帮助吗?
【解决方案3】:

我认为问题可能是您需要对 like 语句进行分组。你的例子完成了:

SELECT * 
FROM some_table
WHERE
(some_col LIKE '%abc%'
OR
some_col LIKE '%xyz%'
OR
some_col LIKE '%pqr%')

【讨论】:

    【解决方案4】:

    如果您必须在LIKE 中使用多个条件,您可以尝试使用UNION,如下所示:

    SELECT * FROM some_table WHERE some_col LIKE '%abc%'
    UNION
    SELECT * FROM some_table WHERE some_col LIKE '%xyz%'
    UNION
    SELECT * FROM some_table WHERE some_col LIKE '%pqr%'
    

    【讨论】:

    • 好的,但这可能需要比使用 OR 的单个查询多 4 倍的资源——如果 Hive 在诸如布尔表达式这样简单的事情上失败,那么它可能在任何事情上都失败:-/
    【解决方案5】:

    如果您只需要检查特定子字符串的列表,您可以使用不同的方法,例如

    WHERE InStr(some_col, 'abc') +InStr(some_col, 'pqr') +... >0

    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-StringFunctions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多