我是Hadoop和Java的新手,我觉得我明显缺少了一些东西。如果这意味着什么的话,我正在使用Hadoop 1.0.3。
我使用hadoop的目标是获取一堆文件并一次解析一个文件(而不是逐行)。每个文件将生成多个键值,但其他行的上下文很重要。键和值是多值/复合的,因此我为键实现了可写比较,为值实现了可写。由于每个文件的处理需要一点 CPU,因此我想保存映射器的输出,然后稍后运行多个化简器。
对于复合键,我遵循[http://stackoverflow.com/questions/12427090/hadoop-composite-key][1]
问题是,输出只是Java对象引用,而不是组合键和值。示例:< code > linkkey writable @ bd2f 9730 LinkValueWritable @ 8752408 c
我不确定这个问题是与根本没有减少数据有关还是
这是我的主要课程:
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(Parser.class);
conf.setJobName("raw_parser");
conf.setOutputKeyClass(LinkKeyWritable.class);
conf.setOutputValueClass(LinkValueWritable.class);
conf.setMapperClass(RawMap.class);
conf.setNumMapTasks(0);
conf.setInputFormat(PerFileInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
PerFileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
还有我的Mapper类:
公共类RawMap扩展MapReduceBase实现映射器{
public void map(NullWritable key, Text value,
OutputCollector<LinkKeyWritable, LinkValueWritable> output,
Reporter reporter) throws IOException {
String json = value.toString();
SerpyReader reader = new SerpyReader(json);
GoogleParser parser = new GoogleParser(reader);
for (String page : reader.getPages()) {
String content = reader.readPageContent(page);
parser.addPage(content);
}
for (Link link : parser.getLinks()) {
LinkKeyWritable linkKey = new LinkKeyWritable(link);
LinkValueWritable linkValue = new LinkValueWritable(link);
output.collect(linkKey, linkValue);
}
}
}
链接基本上是各种信息的结构,在LinkKeyWritable和LinkValueWritable之间拆分
LinkKeyWritable:
public class LinkKeyWritable implements WritableComparable<LinkKeyWritable>{
protected Link link;
public LinkKeyWritable() {
super();
link = new Link();
}
public LinkKeyWritable(Link link) {
super();
this.link = link;
}
@Override
public void readFields(DataInput in) throws IOException {
link.batchDay = in.readLong();
link.source = in.readUTF();
link.domain = in.readUTF();
link.path = in.readUTF();
}
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(link.batchDay);
out.writeUTF(link.source);
out.writeUTF(link.domain);
out.writeUTF(link.path);
}
@Override
public int compareTo(LinkKeyWritable o) {
return ComparisonChain.start().
compare(link.batchDay, o.link.batchDay).
compare(link.domain, o.link.domain).
compare(link.path, o.link.path).
result();
}
@Override
public int hashCode() {
return Objects.hashCode(link.batchDay, link.source, link.domain, link.path);
}
@Override
public boolean equals(final Object obj){
if(obj instanceof LinkKeyWritable) {
final LinkKeyWritable o = (LinkKeyWritable)obj;
return Objects.equal(link.batchDay, o.link.batchDay)
&& Objects.equal(link.source, o.link.source)
&& Objects.equal(link.domain, o.link.domain)
&& Objects.equal(link.path, o.link.path);
}
return false;
}
}
LinkValueWritable:
public class LinkValueWritable implements Writable{
protected Link link;
public LinkValueWritable() {
link = new Link();
}
public LinkValueWritable(Link link) {
this.link = new Link();
this.link.type = link.type;
this.link.description = link.description;
}
@Override
public void readFields(DataInput in) throws IOException {
link.type = in.readUTF();
link.description = in.readUTF();
}
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(link.type);
out.writeUTF(link.description);
}
@Override
public int hashCode() {
return Objects.hashCode(link.type, link.description);
}
@Override
public boolean equals(final Object obj){
if(obj instanceof LinkKeyWritable) {
final LinkKeyWritable o = (LinkKeyWritable)obj;
return Objects.equal(link.type, o.link.type)
&& Objects.equal(link.description, o.link.description);
}
return false;
}
}
看起来你有一个你想要的对象列表。如果你想打印出一个人类可读的版本而不是一个丑陋的java引用,你需要在你的可写上实现toString()。
我认为答案在于TextOutputFormat的实现。具体来说,LineRecordWriter的writeObject方法:
/**
* Write the object to the byte stream, handling Text as a special
* case.
* @param o the object to print
* @throws IOException if the write throws, we pass it on
*/
private void writeObject(Object o) throws IOException {
if (o instanceof Text) {
Text to = (Text) o;
out.write(to.getBytes(), 0, to.getLength());
} else {
out.write(o.toString().getBytes(utf8));
}
}
如您所见,如果您的键或值不是Text对象,它会调用toString方法并将其写出。由于您在键和值中未实现toString,因此它使用Object类的实现,即写出引用。
我认为您应该尝试编写一个合适的toString函数或使用不同的OutputFormat。
使用代替和代替 然后在请求属性中添加 但是当我在javascript中检索它时,我得到了jsonObject的值 我在我的项目中已经使用了下面的库,如果需要,可以使用任何新的库
我正在尝试弹出一个自定义对话框,当我点击一个按钮,但它不会弹出在所有。我的应用程序基本上是一个日历,我将使用sqlite在日历中添加/保留约会和其他内容,使用对话框,这是指定约会细节的地方。 我为此使用的代码如下: 我做错了什么?
问题内容: 我正在尝试为Json.NET创建一个自定义ValueProvider,它将跳过序列化所有对象的过程,并将仅返回Guid类型的属性来表示其主键(作为参考)。 例: 应成为: 这是我到目前为止编写的代码。我非常接近使其工作,但是就我而言,我似乎无法获取对象值。我怎样才能做到这一点? 问题答案: 您希望将值从嵌套对象内部提升到父对象。为此,您需要将两个价值提供者链接在一起: 一个外部值提供者
我将springboot控制器与@RequestBody一起使用。我有以下json请求正文 我有一个对应的POJO 我有控制器就像 显然它不起作用,因为是请求中的字符串,而它在MyObject中是布尔值。我希望它有一个逻辑,所以如果在请求中,它将在MyObject中转换为布尔值。Spring有什么机制来实现这一点?
我有一个具有20个属性的对象。 其中有些属性设置为值,有些未定义。当I!如何将未显示键值的设置为?
问题内容: 我是否可以使用标准方法将自己的自定义对象添加到Map,然后将其正确编组到MapMessage中?当前,我收到无效对象类型消息。我注意到WebSphere有解决方案,但是我正在寻找不受特定AS约束的东西,如果没有这种方法,也许JBoss支持的东西会起作用。 如何在WebSphere中进行操作:http : //publib.boulder.ibm.com/infocenter/dmndh