gpt4 book ai didi

Hadoop - 组合键

转载 作者:可可西里 更新时间:2023-11-01 14:11:51 28 4
gpt4 key购买 nike

假设我有一个制表符分隔的文件,其中包含格式如下的用户事件数据:

timestamp  user_id  page_id  action_id

我想写一个 hadoop 作业来统计每个页面上的用户操作,所以输出文件应该是这样的:

user_id  page_id  number_of_actions

我在这里需要类似复合键的东西——它会包含 user_id 和 page_id。有什么通用的方法可以用 hadoop 做到这一点吗?我找不到任何有用的东西。到目前为止,我在映射器中发出这样的 key :

context.write(new Text(user_id + "\t" + page_id), one);

它有效,但我觉得这不是最好的解决方案。

最佳答案

只需编写您自己的Writable。在您的示例中,解决方案可能如下所示:

public class UserPageWritable implements WritableComparable<UserPageWritable> {

private String userId;
private String pageId;

@Override
public void readFields(DataInput in) throws IOException {
userId = in.readUTF();
pageId = in.readUTF();
}

@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(userId);
out.writeUTF(pageId);
}

@Override
public int compareTo(UserPageWritable o) {
return ComparisonChain.start().compare(userId, o.userId)
.compare(pageId, o.pageId).result();
}

}

虽然我认为您的 ID 可能是 long,但这里您有 String 版本。基本上只是 Writable 接口(interface)上的正常序列化,请注意它需要默认构造函数,因此您应该始终提供一个。

compareTo 逻辑清楚地告诉了如何对数据集进行排序,还告诉 reducer 哪些元素是相等的,以便可以对它们进行分组。

ComparisionChainGuava 的一个很好的实用程序.

不要忘记覆盖 equals 和 hashcode!partitioner 将根据键的 hashcode 确定 reducer。

关于Hadoop - 组合键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12427090/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com