gpt4 book ai didi

hadoop - 为什么此代码不对 reducer 值进行两次迭代?

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

我有这个代码:

public void reduce(Text key, Iterable<Text> values, Context context) 
throws IOException, InterruptedException
{
String name = null;
String sid = null;
String predicate = null;
String oid = null;
String id = null;
String outKey = null;
String outVal = null;

LinkedList<Text> valuesList = new LinkedList<Text>();
Iterator<Text> ite = values.iterator();
while(ite.hasNext()) {
Text t = ite.next();
String[] entities = t.toString().split("#-#-#-#");
if(entities[entities.length-1].equalsIgnoreCase("topic_name"))
{
name = entities[0];
}
valuesList.add(t);
}
Iterator<Text> ite2 = valuesList.iterator();
while(ite2.hasNext()) {
Text t2 = ite2.next();
String[] entities = t2.toString().split("#-#-#-#");
if(!entities[entities.length-1].contains("topic_name"))
{
if(name!=null) {
outKey = entities[0]+"\t"+entities[1]+"\t"+name;
}
else
{
outKey = entities[0]+"\t"+entities[1]+"\t"+key.toString();
}
context.write(new Text(outKey), null);
}
}
}

我看到当我再次遍历这些值时,它总是采用缓存副本中的最后一个值。

最佳答案

第一个迭代器实际上总是返回相同的 Text对象,它只是在每次调用之前用不同的字符串填充它。它这样做是为了节省实例化对象的时间。所以你实际上是在建立一个 List<Text>包含同一对象的多个副本。要解决此问题,您应该将值保存到 List<String> 中包含实际的“未装箱”值。像这样:

        LinkedList<String> valuesList = new LinkedList<String>();
Iterator<Text> ite = values.iterator();
while(ite.hasNext()) {
Text t = ite.next();
String[] entities = t.toString().split("#-#-#-#");
if(entities[entities.length-1].equalsIgnoreCase("topic_name"))
{
name = entities[0];
}
valuesList.add(t.toString());
}
Iterator<String> ite2 = valuesList.iterator();
while(ite2.hasNext()) {
String t2 = ite2.next();
String[] entities = t2.split("#-#-#-#");
if(!entities[entities.length-1].contains("topic_name"))
{
if(name!=null) {
outKey = entities[0]+"\t"+entities[1]+"\t"+name;
}
else
{
outKey = entities[0]+"\t"+entities[1]+"\t"+key.toString();
}
context.write(new Text(outKey), null);
}
}

关于hadoop - 为什么此代码不对 reducer 值进行两次迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530906/

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