Hive 选择行,其中 A 列中的字符串包含 B 列中的字符串

Posted

技术标签:

【中文标题】Hive 选择行,其中 A 列中的字符串包含 B 列中的字符串【英文标题】:Hive select rows where string in column A contains string from column B 【发布时间】:2018-08-23 21:01:30 【问题描述】:

我有一个数据集,其中包含一些行,其中一列中有无效条目。

我正在尝试从 B 列和 C 列中选择所有不同的行,但 B 列的条目无效。 A 列中的字符串包含 B 列的正确名称,所以如果我能弄清楚如何选择 str(b) 在 str(a) 中的所有行,那么我应该只得到正确的数据。

伪代码可能如下所示:

SELECT DISTINCT b,c FROM some.log WHERE date = 'today' AND str(b) IN str(a)

我知道如何使用 Python 来解决此问题,但 A 列在每一行上都是唯一的。因此,如果我选择不同的行并包含 A 列,我实际上只是选择了所有行,这会产生一个 60gb 的文件。

python 代码如下所示:

df = df[df.apply(lambda x: x.name in x.url, axis=1)]

这会导致这样的事情:

df

a                         b        c
/bobs/burgers/1234        bobs     idx 
/bobs/burgers/2234        fred     idx
/cindys/sandwhiches/3234  cindy    idx

df = df[df.apply(lambda x: x.name in x.url, axis=1)]

a                         b        c
/bobs/burgers/1234        bobs     idx
/cindys/sandwhiches/3234  cindy    idx

是否可以使用 Hive 进行过滤,从而无需下载大文件并使用 python 处理?

【问题讨论】:

【参考方案1】:

除了likerlike,你还可以使用这些函数:

使用instr

select distinct b,c from some.log where date = current_date and a instr(a,b) > 0;

使用locate

select distinct b,c from some.log where date = current_date and locate(b, a) > 0;

参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

【讨论】:

【参考方案2】:

LIKERLIKE

select distinct b,c from some.log where date = 'today' and a like concat('%',b,'%');

或者

select distinct b,c from some.log where date = 'today' and a rlike concat('*',b,'*');

【讨论】:

'like' 为我工作。注意:如果您正在查找列中的特定子字符串,只需输入where column like '%substring%',它就可以完成这项工作

以上是关于Hive 选择行,其中 A 列中的字符串包含 B 列中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

hive sql - 如何选择 hive 数组列中的前 n 个元素并返回所选数组

SQL / Hive 选择具有特定列值的第一行

查询与 Hive QL 中另一列中的每个值关联的最短字符串值的更有效方法

如果子字符串列表中的任何值包含在数据框中的任何列中,则过滤行

通过 Hive 或 Impala 或 Pig 中的字符串匹配连接表

返回查询的所有行,其中一列中的字符串值与另一列中的字符串值匹配