Apache pig 用两个文件表示pig查询

Apache pig 用两个文件表示pig查询,apache-pig,Apache Pig,我被猪的问题难住了。我有一个数据文件,其中有一个客户信息和两个文件,其中客户数据可以是 数据文件可能是 客户ID年龄 100 27 101 17 102 25 103 21 文件1可能是 客户ID性别 100米 102楼 文件2可能是 客户ID性别 101 F 102米 103米 现在,我希望以以下方式输出。如果文件1中有客户Id,那么应该从文件1中选择性别。如果它不在那里,那么应该从 文件2 所以,我希望输出是 客户ID年龄性别 100 27米 101 17 F 102 25 F(从文件1中选

我被猪的问题难住了。我有一个数据文件,其中有一个客户信息和两个文件,其中客户数据可以是

数据文件可能是

客户ID年龄
100 27
101 17
102 25
103 21

文件1可能是

客户ID性别
100米
102楼

文件2可能是

客户ID性别
101 F
102米
103米

现在,我希望以以下方式输出。如果文件1中有客户Id,那么应该从文件1中选择性别。如果它不在那里,那么应该从 文件2

所以,我希望输出是

客户ID年龄性别
100 27米
101 17 F
102 25 F(从文件1中选择,文件1获得首选项)
103 21米


所以,如果我尝试将数据文件与CustomerId上的File1进行左外连接,那么CustomerId 101和103的性别值将为NULL。所以,现在我希望customerid101和103的性别值从File2填充。我不能做这件事。此外,我们是否需要首先进行左外联接。

假设您已按如下方式加载数据:

DESCRIBE file1;
file1: {(id:int, gender:chararray)}
DESCRIBE file2;
file2: {(id:int, gender:chararray)}
你把它们连接在一起,就像:

joined = JOIN file1 BY id FULL OUTER, file2 BY id;
DESCRIBE joined;
joined: {(file1::id:int, file1::gender:chararray, file2::id:int, file2::gender:chararray)}
在保证非空性别的同时赋予文件1优先级只需要一个三元运算符:

genders =
    FOREACH joined
    GENERATE
        ((file1::id IS NOT NULL) ? file1::id : file2::id) AS id,
        ((file1::gender IS NOT NULL) ? file1::gender : file2::gender) AS gender;

现在,您已经有了每个客户ID的单一性别主列表,您可以将其与主数据文件连接起来,并根据自己的喜好使用它。

我们可以在不使用自定义项的情况下执行此操作吗?Pig中有任何内置函数用于此。谢谢Winnicklaus。我们不能在这里使用地图吗?我只是想知道加入是否会影响性能?如果你认为地图是一种查找工具,那么你就不会像猪一样思考了。Pig关注的是数据流,而不是算法。使用
JOIN
是查找的一种方法。如果您的数据足够小,可以将其全部作为映射放入内存中,那么连接不会花费很长时间。另外,在这种情况下,您可以使用“复制的”添加
,这样连接就不需要缩减阶段。谢谢WinnieNicklaus。我的想法是连接就像O(n2)。这就像对所有其他表的所有ID进行线性扫描一样。所以,这就是为什么我认为这可能是一个昂贵的手术。同时,我想任何可以调用reduce作业的操作都将是一个昂贵的操作,如Join、Group By、Order By等。感谢您指出使用复制。但是使用“复制”有什么缺点吗?没有扫描。在带有reduce阶段的标准连接中,记录是根据连接键分发的,因此它们在reduce时间已经在一起了。由于
使用“复制的”
,它基本上会将其读入一个映射,因此每次查找都是O(1)。如果可以使用“复制的”
,则使用“复制的”没有任何不利之处。但是如果你的数据实际上不符合内存,你的工作就会失败。好的,温妮知道了。谢谢你的解释。如果我想在genders模式中添加另一个chararray字段,它表示性别来自哪个文件,我们可以使用genders=FOREACH joined生成((file1::id不为NULL)?file1::id:file2::id)作为id,((file1::gender不为NULL)?file1::gender:file2::gender)作为gender((file1::id不为NULL)?“file1”:“file2”)作为标识符