Apache pig 确定独立关系中int的成员身份

Apache pig 确定独立关系中int的成员身份,apache-pig,Apache Pig,这与确定一个关系中元组的int值是否是另一个关系中列的成员值有关。我对猪拉丁语还不熟悉,我发现很难把我的思想集中在这个框架上 目前我有两个表,一个表包含一个id列表和一个值域较小的标记,另一个表包含一个元组,元组包含一个id和一个引用另一个表的标记id 这里是orders.csv: id,标签 1597,x 999,y 787,a 812,x 和tags.csv: id,tag\u id 11、55 99812 22787 我需要一种方法来确定order表中所有元组的tag_id是否是tag表i

这与确定一个关系中元组的int值是否是另一个关系中列的成员值有关。我对猪拉丁语还不熟悉,我发现很难把我的思想集中在这个框架上

目前我有两个表,一个表包含一个id列表和一个值域较小的标记,另一个表包含一个元组,元组包含一个id和一个引用另一个表的标记id

这里是orders.csv:

id,标签

1597,x

999,y

787,a

812,x

和tags.csv:

id,tag\u id

11、55

99812

22787

我需要一种方法来确定order表中所有元组的tag_id是否是tag表id子集的成员

id,有

111,0

99,1

22,0

这就是我到目前为止所做的:

使用jython作为任务注册“s3://bucket/jython_task.py”

tags=使用PigStorage加载's3://bucket/tags.csv','AS id:long,tag:chararray

orders=使用PigStorage加载's3://bucket/orders.csv','AS id:long,tag_id:long

tags=按tag=='x'筛选标记

x_cases=foreach标记生成标记

tagged_orders=foreach orders生成id、tag_id、tasks.check_membershiptag_id、x_cases.tag as is_x:int

以及自由民主党:

def check_membership(instance, value_list):
if instance != None:
    for value in value_list:
        if instance == value[0]:
            return 1
return 0
我得到一个错误:

2012-09-20 23:53:45377[main]错误org.apache.pig.tools.pigstats.SimplePostStats-错误2997:无法从备份中重新创建异常错误:org.apache.pig.backend.executionengine.ExecutionException:错误0:Scalar在输出中有多行。第一次:7995,第二次:8028


我做错了什么?有没有更好的方法来做我想做的事情?

我不知道UDF中的问题是什么,但是你可以用纯PIG得到结果。使用COGROUP和IsEmpty内置函数

x_cases = cogroup orders by (tag_id), tags by (id);
tagged_orders = foreach x_cases generate flatten(orders), IsEmpty(tags);

它可能不是运行最快的实现,因为它使用了Reduce-side连接,但这完全取决于卷

一种更快的方法可能是使用复制联接,它将标签表加载到RAM中,并使用映射端联接,这一方法更快。糟糕的是,您将丢失未标记的记录

tagged_orders = join orders by (tag_id), tags by (id) using 'replicated';

我不知道UDF中的问题是什么,但是你可以用纯猪得到结果。使用COGROUP和IsEmpty内置函数

x_cases = cogroup orders by (tag_id), tags by (id);
tagged_orders = foreach x_cases generate flatten(orders), IsEmpty(tags);

它可能不是运行最快的实现,因为它使用了Reduce-side连接,但这完全取决于卷

一种更快的方法可能是使用复制联接,它将标签表加载到RAM中,并使用映射端联接,这一方法更快。糟糕的是,您将丢失未标记的记录

tagged_orders = join orders by (tag_id), tags by (id) using 'replicated';

我最终找到了一个解决我自己问题的方法,它涉及到一个针对这两个关系的左外连接,可能有一个更优雅的方法,我愿意接受任何更好的方法

tags=使用PigStorage加载's3://bucket/tags.csv','AS id:long,tag:chararray

orders=使用PigStorage加载's3://bucket/orders.csv','AS id:long,tag_id:long

tags=按tag=='x'筛选标记

tag\u cases=foreach tags生成id,1个as-found\u tag:int

标记案例=不同的标记案例

示例=按o_id连接订单左外标签按id连接案例

example=foreach示例生成订单::o_id作为id,tag_cases为null?0:1 as有_标签


我最终找到了一个解决我自己问题的方法,它涉及到一个针对这两个关系的左外连接,可能有一个更优雅的方法,我愿意接受任何更好的方法

tags=使用PigStorage加载's3://bucket/tags.csv','AS id:long,tag:chararray

orders=使用PigStorage加载's3://bucket/orders.csv','AS id:long,tag_id:long

tags=按tag=='x'筛选标记

tag\u cases=foreach tags生成id,1个as-found\u tag:int

标记案例=不同的标记案例

示例=按o_id连接订单左外标签按id连接案例

example=foreach示例生成订单::o_id作为id,tag_cases为null?0:1 as有_标签


将示例输入和预期输出添加到您的问题中确实有助于更快地获得答案。将示例输入和预期输出添加到您的问题中确实有助于更快地获得答案。请关闭,但我想用int填充is_x字段,指示给定顺序中存在标记。我最终找到了我的问题的解决方案,它涉及到一个针对这两个关系的左外连接,可能有一个更优雅的解决方案,我对任何更好的解决方案都持开放态度。关闭,但我想用一个int填充is_x字段,表示给定顺序中存在标记。我最终找到了我的问题的解决方案,它涉及到一个针对这两个关系的左外连接,可能有一个更优雅的解决方案,我愿意接受任何更好的解决方案。