配置单元选择行,其中A列中的字符串包含B列中的字符串

时间:2018-08-23 21:01:31

标签: hive hiveql

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

我正在尝试从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处理?

2 个答案:

答案 0 :(得分:3)

除了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

答案 1 :(得分:0)

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,'*');