如何在MapReduce的Configuration对象中传递一个整数数组作为属性值



我们可以传递一个整数作为配置属性,如下所示:

Configuration conf = new Configuration();
conf.set("size", 4);

有没有一种方法可以将整数数组作为属性值发送?

conf.set("list.of.nums", {2, 4, 6, 8}); // one way is to pass them as a String but it doesn't look good

您可以将数组对象序列化为一个文件,然后将该文件移动到HDFS。然后,您可以使用以下方法将HDFS文件路径添加到分布式缓存。

DistributedCache.addCacheFile(new URI(dfsMetaPath + "#"
                + Constants.OBJSYMLINK0), conf);
        DistributedCache.createSymlink(conf);

序列化可以按如下方式进行:-

public static <T> void serializeMetadata(T voObj,
        String filePath) throws IOException,NullPointerException {
    if(null==voObj){
        throw new NullPointerException("NULL object found");
    }
    ObjectOutputStream oout = null;
    FileOutputStream fsout = null;
    try {
        fsout = new FileOutputStream(filePath);
        oout = new ObjectOutputStream(fsout);
        oout.writeObject(voObj);
        oout.close();
    } finally {
        if (null != fsout) {
            fsout.close();
        }
        if (null != oout) {
            oout.close();
        }
    }
}

您可以使用作为参数传递给上述方法的文件路径。使用此文件路径,您可以将文件移动到HDFS文件路径。使用HDFS文件路径创建符号链接。

要在mapper中退休,您可以使用以下内部设置来取回对象。

File hdfsfilepath = new File(Constants.OBJSYMLINK0);
Integer[] youarray = MetadataSerDeUtils.deserializeMetadata(youarray ,
                hdfsfilepath.getAbsolutePath());

对于反序列化,您可以使用以下代码:-

public static <T> T deserializeMetadata(T voObj,
        String filePath) throws IOException,NullPointerException, ClassNotFoundException {
    FileInputStream fsin = null;
    ObjectInputStream oin = null;
    try {
        fsin = new FileInputStream(filePath);
        oin = new ObjectInputStream(fsin);
        voObj = (T) oin.readObject();
        return voObj;
    } finally {
        if (null != fsin) {
            fsin.close();
        }
        if (null != oin) {
            oin.close();
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新