将一条记录与 Pig 中另一个数据集中的另一条记录进行比较

Comparing one record to another in another data set in Pig

我是 Pig 的初学者,我正在处理一个大型业务数据文件。业务数据文件包含来自世界各地的城市,我希望只与美国城市合作。我 LOADED 两个数据集都成功了,我正在尝试遍历整个业务数据文件并删除所有不在美国城市数据集中的城市。

raw_bus_data = LOAD 'globalbus.json' USING com.twitter.elphantbird.pig.load.JsonLoader('-nestedLoad') as (row: map[]);

us_citystate = LOAD 'us.csv' USING PigStorage(',') AS (city:chararray, state:chararray);

我意识到下一行行不通,但我正在尝试做类似的事情:

bus_us_data = FILTER raw_bus_data BY state == us_citystate state;

这是我需要使用 FOREACH 的东西吗?

您可以执行内部联接,这将有效地过滤掉任何不包含美国州的行。因为 us_citystate 每个州有多行(每个城市一个),您需要创建一个新关系 B 每个州只包含一行,否则您将复制 [=13= 中的行].执行此操作的代码和内部连接是:

A = FOREACH us_citystate GENERATE state;
B = DISTINCT A;
C = JOIN raw_bus_data BY state, B BY state;
bus_us_data = FOREACH C GENERATE 
    raw_bus_data::var1 AS var1, 
    raw_bus_data::var2 AS var2;

其中 var1、var2 等是您希望从 raw_bus_data 中保留的字段。