当前位置: 首页 > 知识库问答 >
问题:

在Hadoop中使用空可写的优点

裴展
2023-03-14

与使用文本(即新文本(空)相比,对键/值使用空可写值有什么优势?我从“Hadoop:权威指南”一书中看到了以下内容。

NullWritable是一种特殊类型的可写,因为它具有零长度序列化。没有字节写入流或从流读取。它用作占位符;例如,在MapReduce中,键或值可以声明为<code>可空写SequenceFile中的键。它是一个不可变的单例:可以通过调用<code>NullWritable.get()来检索实例

我不太明白如何使用< code>NullWritable写出输出?在开始的输出文件中是否会有一个常量值指示该文件的键或值为< code>null,以便MapReduce框架可以忽略读取< code>null键/值(无论哪个是< code>null)?另外,< code>null文本实际上是如何序列化的呢?

谢谢,

文卡特

共有3个答案

高弘光
2023-03-14

您可以始终将字符串包装在自己的可写类中,并用一个布尔值来指示它是否包含空字符串:

@Override
public void readFields(DataInput in) throws IOException { 
    ...
    boolean hasWord = in.readBoolean();
    if( hasWord ) {
        word = in.readUTF();
    }
    ...
}

@Override
public void write(DataOutput out) throws IOException {
    ...
    boolean hasWord = StringUtils.isNotBlank(word);
    out.writeBoolean(hasWord);
    if(hasWord) {
        out.writeUTF(word);
    }
    ...
}
胡夕
2023-03-14

我改变跑步方法。和成功

@Override
public int run(String[] strings) throws Exception {
    Configuration config = HBaseConfiguration.create();  
    //set job name
    Job job = new Job(config, "Import from file ");
    job.setJarByClass(LogRun.class);
    //set map class
    job.setMapperClass(LogMapper.class);

    //set output format and output table name
    //job.setOutputFormatClass(TableOutputFormat.class);
    //job.getConfiguration().set(TableOutputFormat.OUTPUT_TABLE, "crm_data");
    //job.setOutputKeyClass(ImmutableBytesWritable.class);
    //job.setOutputValueClass(Put.class);

    TableMapReduceUtil.initTableReducerJob("crm_data", null, job);
    job.setNumReduceTasks(0);
    TableMapReduceUtil.addDependencyJars(job);

    FileInputFormat.addInputPath(job, new Path(strings[0]));

    int ret = job.waitForCompletion(true) ? 0 : 1;
    return ret;
}
曹沛
2023-03-14

键/值类型必须在运行时给出,因此任何写入或读取NullWritables的内容都将提前知道它将处理该类型;文件中没有标记或任何东西。从技术上讲,NullWritables是“读取”的,只是“读取”一个NullWritable实际上是一种禁止操作。您可以自己看到根本没有写入或读取任何内容:

NullWritable nw = NullWritable.get();
ByteArrayOutputStream out = new ByteArrayOutputStream();
nw.write(new DataOutputStream(out));
System.out.println(Arrays.toString(out.toByteArray())); // prints "[]"

ByteArrayInputStream in = new ByteArrayInputStream(new byte[0]);
nw.readFields(new DataInputStream(in)); // works just fine

至于您关于< code>new Text(null)的问题,您也可以尝试一下:

Text text = new Text((String)null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
text.write(new DataOutputStream(out)); // throws NullPointerException
System.out.println(Arrays.toString(out.toByteArray()));

Text对于nullString根本不起作用。

 类似资料:
  • 在hadoop(hdfs)下/中创建销售目录 [hdfs@vm1~]$hadoop fs-mkdir/sale 它获得了755(rwxr-xr-x)权限,如下所示 [hdfs@vm1~]$hadoop fs-ls/ DRWXR-XR-X-HDFS超群0 201 5-04-11 18:12/销售 加号+表示目录上已设置默认acl [hdfs@vm1~]$hadoop fs-getfacl/sale

  • 问题内容: 我的问题对于HADOOP用户而言似乎很愚蠢。但是我对在地图减少问题中使用泛型感到困惑,例如“ WORD COUNT”。 我知道,泛型被基本用于类型转换和类型安全。但是我不能在这里将这个概念联系起来。 在字数问题上, 请任何人在这里让我明白泛型的使用 。如果我在问这个问题时犯了任何错误,请纠正我。 现在,我了解将泛型用于键值对(KEY IN,VALUE IN,KEY OUT,VALUE

  • 本文向大家介绍Hadoop MapReduce编程的优势,包括了Hadoop MapReduce编程的优势的使用技巧和注意事项,需要的朋友参考一下 大数据基本上是一个涵盖大型和复杂数据集的术语。为了处理它,与传统类型相比,需要使用不同的数据处理应用程序。 尽管有各种应用程序可以处理和处理大数据,但基本框架始终是Apache Hadoop的框架。 什么是Apache Hadoop? Hadoop是一

  • Ceph 文件系统可作为 Hadoop 文件系统( HDFS )的落地式替代品,本章描述了 Ceph 用于 Hadoop 存储的安装和配置过程。 依赖关系 CephFS 的 Java 接口 Hadoop 的 CephFS 插件 Important 当前要求 Hadoop 1.1.x 稳定版系列。 安装 在 CephFS 上使用 Hadoop 有三个必要条件。首先,必须有一个运行的 Ceph 。建设

  • 本文向大家介绍Hadoop性能调优?相关面试题,主要包含被问及Hadoop性能调优?时的应答技巧和注意事项,需要的朋友参考一下 调优可以通过系统配置、程序编写和作业调度算法来进行。 hdfs的block.size可以调到128/256(网络很好的情况下,默认为64) 调优的大头:mapred.map.tasks、mapred.reduce.tasks设置mr任务数(默认都是1) mapred.ta