在地图性能调整中过滤

时间:2015-07-11 15:41:05

标签: apache-spark

我有两(2)个日志文件,包含相同结构的相同信息(将日志B视为'备份')。

n

现在缺少Log A: branchId, createdAt, value, subBranchId, etc.. Log B: branchId, createdAt, value ,我想将其替换为A.value

这是我尝试做到的。它在我的本地主机上使用小数据运行良好,但在生产中运行时永远运行。

B.value

您对如何优化它有什么建议吗?我认为JavaRDD<String> logA = sc.textFile(oldFilePath).cache(); JavaRDD<String> logB = sc.textFile(newFilePath).cache(); mappedLogB = logB.map(new Function<String, LogB>() { private static final long serialVersionUID = 4815459211285505398L; public LogB call(String s) throws JsonParseException, JsonMappingException, IOException { ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(s, LogB.class); } }).cache(); JavaRDD<String> revisedLogA = logA.map(new Function<String, String>() { private static final long serialVersionUID = -6211649129122188980L; public String call(String s) { String[] splitted = s.split("\t"); String branchId = splitted[0]; String createdAt = splitted[1]; String value = splitted[2]; if (StringUtils.isEmpty(value)) { JavaRDD<LogB> filtered = mappedLogB.filter(new FilteredLogB(branchId, createdAt)); if (filtered.count() == 1) { splitted[2] = filtered.first().getValue(); } } return StringHelper.toTabSeparatedString(Arrays.asList(splitted)); } }); revisedLogA.saveAsTextFile(saveOldFilePath); 效率低下但直到现在我还不知道其他任何方式来获得我想要的东西。

1 个答案:

答案 0 :(得分:0)

如果我没有弄错的话,对于你错过了价值的日志A中的每个条目,你都要经历整个日志B.如果日志B的大小合适或者有很多,那么这显然会变得很慢A中缺少值。我建议你首先找到缺少值的log A中的值,将log A和B转换为带有密钥(branchId,createdAt)的对RDD,然后简单地进行连接。这样您就可以获得一对RDD(branchId,createdAt)作为键,并且(logBvalue,logAvalue,subBranchId,...)作为值。之后,您可以使用logBvalue将每个对映射到一个字符串中。