知识点
相关文章
更多最近更新
更多Hadoop文本转换为序列文件
2019-03-28 12:56|来源: 网络
在以前使用Hadoop的时候因为mahout里面很多都要求输入文件时序列文件,所以涉及到把文本文件转换为序列文件或者序列文件转为文本文件(因为当时要分析mahout的源码,所以就要看到它的输入文件是什么,文本比较好看其内容)。一般这个有两种做法,其一:按照《Hadoop权威指南》上面的方面直接读出序列文件然后写入一个文本;其二,编写一个job任务,直接设置输出文件的格式,这样也可以把序列文件读成文本(个人一般采用这样方法)。
相关阅读:
Hadoop权威指南(中文第2版)PDF http://www.linuxidc.com/Linux/2012-07/65972.htm
Hadoop序列化文件SequenceFile http://www.linuxidc.com/Linux/2013-06/86701.htm
时隔好久,今天又重新试了下,居然不行了?,比如,我要编写一个把文本转为序列文件的java程序如下:
package mahout.fansy.canopy.transformdata;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;
import org.apache.mahout.common.AbstractJob;
import org.apache.mahout.math.RandomAccessSparseVector;
import org.apache.mahout.math.Vector;
import org.apache.mahout.math.VectorWritable;
public class Text2VectorWritable extends AbstractJob{
@Override
public int run(String[] arg0) throws Exception {
addInputOption();
addOutputOption();
if (parseArguments(arg0) == null) {
return -1;
}
Path input=getInputPath();
Path output=getOutputPath();
Configuration conf=getConf();
Job job=new Job(conf,"text2vectorWritable with input:"+input.getName());
// job.setInputFormatClass(SequenceFileInputFormat.class);
job.setOutputFormatClass(SequenceFileOutputFormat.class);
job.setMapperClass(Text2VectorWritableMapper.class);
job.setMapOutputKeyClass(Writable.class);
job.setMapOutputValueClass(VectorWritable.class);
job.setNumReduceTasks(0);
job.setJarByClass(Text2VectorWritable.class);
FileInputFormat.addInputPath(job, input);
SequenceFileOutputFormat.setOutputPath(job, output);
if (!job.waitForCompletion(true)) {
throw new InterruptedException("Canopy Job failed processing " + input);
}
return 0;
}
public static class Text2VectorWritableMapper extends Mapper<Writable,Text,Writable,VectorWritable>{
public void map(Writable key,Text value,Context context)throws IOException,InterruptedException{
String[] str=value.toString().split(",");
Vector vector=new RandomAccessSparseVector(str.length);
for(int i=0;i<str.length;i++){
vector.set(i, Double.parseDouble(str[i]));
}
VectorWritable va=new VectorWritable(vector);
context.write(key, va);
}
}
}
相关问答
更多-
python字符串怎么和整数连接?[2022-02-20]
序列 -
尝试使用Context而不是OutputCollector 。 public class ReduceTask extends Reducer
{ public void reduce(Text key,Iterable values,Context context){ for(Text value:values){ try { context.writ ... -
Hadoop MapReduce:返回文本文件中单词的排序列表(Hadoop MapReduce: return sorted list of words in a text file)[2023-05-17]
免责声明:我不是Hadoop用户,但我使用CouchDB做了很多Map / Reduce。 如果你只需要键,为什么不发出空值? 而且,听起来你根本不想减少它们,因为你想要在每次出现时得到一把钥匙。 Disclaimer: I'm not an Hadoop user, but I do a lot of Map/Reduce with CouchDB. If you just need the keys, why don't you emit an empty value? Moreover, it sou ... -
Avro用于描述与平台无关的数据模式(A'数据序列化系统')。 图像本身可以以各种格式(PNG,JPEG,BMP,GIF等)进行编码,所有这些格式都可以表示为字节序列。 您还可以定义一些关于图像的元数据(无论如何都可能以字节编码,但根据您的使用情况,提取它可能很有用。 原始模式可以如下(根据文档改编): {"namespace": "example.avro", "type": "record", "name": "Image", "fields": [ {"name": "filename ...
-
Apache Hadoop可能是读取序列文件的好工具。 但是,除了开玩笑之外,为什么不编写最简单的Mapper java程序,使用Jackson来序列化它看到的每个键和值对? 这将是一个非常容易编写的程序。 I thought there must be some tool which will do this given that its such common requirement. Yes, it should be pretty easy to code but again why to do s ...
-
GoogleHadoopFileSystem无法强制转换为hadoop FileSystem?(GoogleHadoopFileSystem cannot be cast to hadoop FileSystem?)[2022-09-14]
简答 实际上它与IsolatedClientLoader有关,我们已经找到了根本原因并验证了修复。 我提交了https://issues.apache.org/jira/browse/SPARK-9206来跟踪这个问题,并通过简单的修复从我的fork成功构建了一个干净的Spark tarball: https : //github.com/apache/spark /拉/ 7549 有一些短期选择: 现在使用Spark 1.3.1。 在bdutil部署中,使用HDFS作为默认文件系统( - --defaul ... -
Hadoop序列文件压缩(Hadoop Sequence File Compression)[2021-08-18]
您可以使用LZO或Snappy https://code.google.com/p/hadoop-snappy/来压缩数据。 您应该将这些配置添加到mapred-site.xmlmapred.compress.map.output true mapred.map.output.compression.codec 使用构造函数Text(String string) : String s = "12,23"; String[] array = s.split(","); Text t1 = new Text(array[0]); Text t2 = new Text(array[1]); Use the constructor Text(String string): String s = "12,23"; String[] array = s.split(","); Text t1 = new Text(array ...Hadoop HDFS和序列文件(Hadoop HDFS and Sequence File)[2022-04-23]
HDFS是一个文件系统,不依赖于任何特定的文件格式。 它是一个分布式文件系统,它抽象出大多数有关文件如何实际持久存储在磁盘上的内部细节(就像NFS / FAT一样)。 它为我们提供了文件和目录结构的连续视图,但在内部实际上,文件被复制并存储在群集中各个节点的块中。 像序列文件这样的文件格式特别适用于地图缩减编程范例,因为它可以很容易地跨数据节点分割,从而实现并行处理。 但是,HDFS没有这样的偏好,它可以将任何文件格式划分为块(即二进制/纯文本)并存储它。 HDFS is a file system and ...您遇到的问题是BytesWritable包含一个字节数组和一个长度。 你必须结合使用这些。 这是我写的一个小单元测试,向您展示发生了什么: @Test public void testBytesWritable() { BytesWritable bw = new BytesWritable(); Text t1 = new Text("ABCD"); bw.set(t1.getBytes(), 0, t1.getLength()); System.out.println( ...