ApachePig:通过来自同一字段的一组值进行筛选的更简单的方法

of1yzvn4  于 2021-06-03  发布在  Hadoop
关注(0)|答案(5)|浏览(301)

假设我想从同一个字段中选择一个数据子集。现在我必须这样做

TestLocationsResults = FILTER SalesData by (StoreId =='17'
or StoreId =='85'
or StoreId =='12'
or StoreId =='45'
or StoreId =='26'
or StoreId =='75'
or StoreId =='13'
)

在sql中,我们可以简单地执行以下操作:

SELECT * FROM SalesData where StoreID IN (17, 12, 85, 45, 26, 75, 13)

在Pig身上有没有一条我错过的捷径?

23c0lvtd

23c0lvtd1#

当数据类型为 chararray ,是使用正则表达式:

TestLocationsResults = FILTER SalesData by StoreID MATCHES '(17|12|85|45|26|75|13)';

当数据类型为 int ,你可以试着 chararray .

jslywgbw

jslywgbw2#

你现在这样做是最好的方式在Pig。所有你现在所做的事情的替代方法要么是刻板的,要么是缓慢的,要么两者兼而有之。希望pig能在将来的版本中添加一个“in”查询,但目前您正在以可用的最佳方式进行此操作。

aydmsdu9

aydmsdu93#

看起来Pig0.12加了一个 IN 接线员。
所以你可以

FILTER SalesData BY StoreID IN (17, 12, 85, 45, 26, 75, 13);
wqsoz72f

wqsoz72f4#

pig中没有in关键字来进行这种集合成员检测。
一个建议,如果写一个自定义项(如本问题/答案所示)。
另一种方法是为每种方法创建一个具有值的关系 StoreId 您希望按筛选,然后对这两个关系执行内部联接。

v7pvogib

v7pvogib5#

一种解决方法是使用内置函数“indexof”,例如:

TestLocationsResults = FILTER SalesData by INDEXOF(',17,12,85,45,26,75,13,', CONCAT(CONCAT(',', StoreId), ',')) > -1;

为了考虑注解,在storeid周围引入“,”符号,使其完全匹配,而不是部分匹配

相关问题