Impala 查询:在管道分隔列表中查找值

Posted

技术标签:

【中文标题】Impala 查询:在管道分隔列表中查找值【英文标题】:Impala Query: Find value in pipe-separated list 【发布时间】:2015-07-02 00:32:31 【问题描述】:

我有一列包含由管道分隔的 STRING 值的行:

|   colA    |
 ___________
| 5|4|2|255 |
| 5|4|4|0   |
| 5|4|4|3   |
| 5|4|4|4   |

我需要创建一个查询,该查询将选择包含 4 或 5 的所有行,但从不选择 2 或 3。类似于以下内容:

SELECT t.colA
FROM my_table t
WHERE (t IN ("4", "5") AND t NOT IN ("2","3")

导致:

|   colA    |
 ___________
| 5|4|4|0   |
| 5|4|4|4   |

我最终使用了以下两个答案的组合,因为单独使用任何一种方法仍然会给我留下仅包含“255”的行。这是最终的查询:

SELECT t.colA
FROM my_table t
WHERE (t.colA IN ('4', '5') OR t.colA LIKE "%|5|%" 
       OR t.colA LIKE "%|5" OR t.colA LIKE "5|%")
AND t.colA NOT LIKE "%3%"    
AND t.colA NOT LIKE "%|2|%" 
AND t.colA NOT REGEXP "^2|%" 
AND t.colA NOT REGEXP "%|2$"

可能有一种更优雅的方法可以做到这一点,但这可以解决问题。

【问题讨论】:

【参考方案1】:

使用LIKE函数怎么样?

where (t like  '%4%' or t like  '%5%')
and (t not like  '%2%' and t not like  '%3%')

这应该可以完成工作。

【讨论】:

哇哦,这么简单我简直不敢相信我没有想到它。非常感谢;像魅力一样工作。

以上是关于Impala 查询:在管道分隔列表中查找值的主要内容,如果未能解决你的问题,请参考以下文章

回顾·基于Impala平台打造交互查询系统

在 Impala 中使用外部创建的 Parquet 文件

一旦我已经在 impala shell 中,如何运行 .sql 文件?

带有制表符分隔值和字段名称的 Impala 外部表

在python中解析管道分隔文件

Impala发布|Impala 3.4的新功能和社区进展