1

假设我想通过它们的值从同一字段中选择一个数据子集。现在我必须做这样的事情

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中是否有我缺少的类似快捷方式?

4

5 回答 5

3

看起来Pig 0.12 添加了一个INoperator

所以你可以做

FILTER SalesData BY StoreID IN (17, 12, 85, 45, 26, 75, 13);
于 2014-11-17T19:08:31.117 回答
1

Pig 中没有 IN 关键字来进行这种集合成员检测。

一个建议是否编写 UDF(如本问题/答案所示)。

另一种可能是为每个StoreId要过滤的值创建一个关系,然后对这两个关系执行内部联接。

于 2013-05-16T00:15:47.357 回答
1

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

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

修改以考虑评论,在 StoreId 周围引入“,”符号以完全匹配而不是部分匹配

于 2013-05-16T14:55:46.670 回答
1

当数据类型为 时,我的解决方案chararray是使用正则表达式:

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

当数据类型为 时int,您可以尝试强制转换为chararray.

于 2013-05-16T15:32:49.810 回答
1

您当前的操作方式是在 Pig 中执行此操作的最佳方式。你现在所做的所有替代方案要么是hacky,要么是慢,或者两者兼而有之。希望 Pig 在未来的版本中添加一个“in”查询,但现在您正在以最好的方式进行操作。

于 2013-05-16T17:31:31.710 回答