hadoopmapreduce:处理reducer中的所有元素组合

ulmd4ohb  于 2021-06-03  发布在  Hadoop
关注(0)|答案(0)|浏览(221)

我想用job先生来解决以下问题。我在hive中有一个巨大的表“fields”,包含从几个sql数据库收集的用户信息。此表中的记录具有以下格式:

user_id, db_name, table_name, field_name, field_value

我正在尝试构建所有可能的用户对,这些用户在某些字段中的一个或多个值与这些用户相等。例如,表“fields”中有以下记录:

user_id = 10021, db_name = "db1", table_name = "contacts",  field_name = "phone", field_value = "613 5246 2433"
user_id = 10021, db_name = "db1", table_name = "contacts",  field_name = "user_mail",  field_value = "john@foobar.com"
user_id = 10021, db_name = "db1", table_name = "contacts",  field_name = "addres", field_value = "21,Sunset Beach" 
...
user_id = 37756, db_name = "db2", table_name = "user_info", field_name = "mobile", field_value = "613 5246 2433"
user_id = 37756, db_name = "db2", table_name = "user_info", field_name = "wrk_email", field_value = "john@foobar.com"
user_id = 37756, db_name = "db2", table_name = "user_info", field_name = "wrk_addr", field_value = "15, Circus Drive"

在这种情况下,我需要建立以下记录来描述一对 matching 用户:

user_1 = 10021, user_2 =37756, field_1 = "user_mail", field_2 = "wrk_email", value =  "john@foobar.com"
user_1 = 10021, user_2 =37756, field_1 = "phone", field_2 = "mobile", value = "613 5246 2433"

为了实现这些,我的mapper函数从配置单元中巨大的“fields”表中读取记录。对于每个记录,我创建一个键值对:(key=field\u value,value=fieldinfo),其中fieldinfo包含该记录的其余字段(user\u id、db\u name、table\u name、field\u name、field\u value)。
结果,reducer函数得到一个非常长的filedinfo对象流,这些对象与一个等于特定字段值的键相关联。建造 pair 我需要找到任意两个的所有组合 user_id -包含在这些filedinfo对象中的。
例如,对于一个字段值 john@foobar.com 我可能会得到几千个filedinfo元素 user_id -s。这意味着我需要建立几千个两个ID的联合体。要构建这些对,我需要能够迭代所有元素,比如n个元素n!次。
我只能沿着reducer提供的流前进,所以我尝试将此流写入一个链表。事实证明,用这种方法我很快就用完了内存。
如何从reducer提供的很长的流中构建组合还有其他想法吗?也许我需要为这个任务使用完全不同的方法,Map器和缩减器函数的其他想法?
谢谢!
有什么意见吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题