现在的位置: 首页 > 综合 > 正文

Mahout0.6-数据格式转换

2018年02月20日 ⁄ 综合 ⁄ 共 7856字 ⁄ 字号 评论关闭

在运行Mahout中的算法之前需要将文本数据(数字或者字符串)转化为SequenceFile格式作为Mahout中算法的输入,待Mahout中的算法执行完成后结果文件也是SequenceFile格式的,SequenceFile格式是Hadoop特有的二进制格式,所以需要将其转化为人可以读懂的文本格式。以上的这一数据转化过程,在上面几章中可见一斑。

本章中将对Mahout中存在的输入、输出格式转化的接口进行总结,其中一些事在以上某些章节中已经使用到的,有的是新增加的。

方法名称

方法描述

InputDriver

数字文件转化为SequenceFile格式

 

 

 

 

 

 

 

 

 

 

 

1 数字文件转化为SequenceFile格式

1.1 简介

数字文件指的是文件中包含的是数字,整型或者浮点型都是可以的,如synthetic_control.data数据,每一行代表了一个样本,每个样本中包括60个属性。

上面已经说过Mahout所能够识别的文件类型是SequenceFile格式的,所以需要首先将数字文本转化为SequenceFile格式,SequenceFile格式是Hadoop所特有的二进制数据文件,以压缩的形式存储信息。

在Mahout中,对数字文件向SequenceFile格式的转化功能已经做了相应封装,在包mahout-integrations-0.6.jar中,可以找到org.apache.mahout.clustering.conversion.InputDriver类中,该类中有个main函数可以通过命令行传递参数进去,进行文件格式转化。

表1-1 数字文件转化为SequenceFile文件的命令行参数

参数名

参数说明

-input (-i) input

文 本数据文件的输入路径

--output (-o) output

SequenceFile文件输出路径

--vector (-v) v

 

经过InputDriver类转换后的SequenceFile文件中的键值对数据类型分别为Text和VectorWritable

注意:不过在下面的聚类例子中,已经把InputDriver的功能又做了一次封装,所以下面的聚类算法中直接传递文本数据是可以执行的。

1.2 使用方式介绍

1)将synthetic_control.data从本地复制到HDFS

$HADOOP_HOME/bin/hadoopfs -mkdir DataTrans/Numeric

$HADOOP_HOME/bin/hadoopfs -put /home/zhongchao/workspace/data/DataTrans/Numeric/synthetic_control.dataDataTrans/Numeric

2)执行转化命令

$MAHOUT0P6_HOME/bin/mahoutorg.apache.mahout.clustering.conversion.InputDriver -iDataTrans/Numeric/synthetic_control.data -o DataTrans/Numeric/seq_synthetic_control.data

执行完上面命令后,生成了SequenceFile文件,存储在seq_synthetic_control.data文件下。如下图,其中转化后的信息存储在part-r-00000中。

图1.2-1 seq_synthetic_control.data中的文件

3)读取seq_synthetic_control.data中文件结果

$MAHOUT0P6_HOME/bin/mahoutvectordump -s DataTrans/Numeric/seq_synthetic_control.data/part-m-00000 -o/home/zhongchao/workspace/data/DataTrans/Numeric/res_text -p -c -ac

用vectordump命令读取结果,格式如下:

60         28.7812,34.4632,31.3381,31.2834,28.9207,33.7596,25.3969,27.7849,35.2479,27.1159,32.8717,29.2171,36.0253,32.337,34.5249,32.8717,34.1173,26.5235,27.6623,26.3693,25.7744,29.27,30.7326,29.5054,33.0292,25.04,28.9167,24.3437,26.1203,34.9424,25.0293,26.6311,35.6541,28.4353,29.1495,28.1584,26.1927,33.3182,30.9772,27.0443,35.5344,26.2353,28.9964,32.0036,31.0558,34.2553,28.0721,28.9402,35.4973,29.747,31.4333,24.5556,33.7431,25.0466,34.9318,34.9879,32.4721,33.3759,25.4652,25.8717

60         24.8923,25.741,27.5532,32.8217,27.8789,31.5926,31.4861,35.5469,27.9516,31.6595,27.5415,31.1887,27.4867,31.391,27.811,24.488,27.5918,35.6273,35.4102,31.4167,30.7447,24.1311,35.1422,30.4719,31.9874,33.6615,25.5511,30.4686,33.6472,25.0701,34.0765,32.5981,28.3038,26.1471,26.9414,31.5203,33.1089,24.1491,28.5157,25.7906,35.9519,26.5301,24.8578,25.9562,32.8357,28.5322,26.3458,30.6213,28.9861,29.4047,32.5577,31.0205,26.6418,28.4331,33.6564,26.4244,28.4661,34.2484,32.1005,26.691

可以看出转化后的SequenceFile格式中key是60,表示的是每个样本中元素/属性的个数,value就是每个样本中的数据。

2 文本文件转化为SequenceFile格式

2.1 简介

如果利用Mahout对文本进行分类、聚类等处理,就需要对文本文件进行处理将其转化为SequenceFile文件,可以使用命令seqdirectory,该命令的实现在包mahout-core-0.6-job.jar中,org.apache.mahout.text.SequenceFilesFromDirectory

表2-1 控制seqdirectory的参数

参数名称

参数解释

可选值

默认值

--input (-i) input

HDFS上文本文件所在路径

 

 

--output (-o) output

HDFS上输出路径,是转化后的SequenceFile格式

 

 

-overwrite (-ow)

如果使用此参数则在运行job前覆盖输出文件

 

 

--chunkSize (-chunk) chunkSize

输出文件块大小

 

 

--fileFilterClass (-filter) fileFilterClass

解析文件所用到的类名

 

org.apache.mahout.text.PrefixAdditionFilter    

--keyPrefix (-prefix) keyPrefix

追加在key值的前缀

 

 

--charset (-c) charset  

编码类型

 

UTF-8 

--help (-h) 

打印帮助信息

 

 

2.2 使用方式

1)将文本文件拷贝到HDFS

$HADOOP_HOME/bin/hadoopfs –mkdir DataTrans/Text

$HADOOP_HOME/bin/hadoopfs -put /home/zhongchao/workspace/data/DataTrans/Text/text.data DataTrans/Text

text.data中存储内容如下:

packageorg.apache.mahout.text;

importjava.lang.reflect.Constructor;

importjava.nio.charset.Charset;

importjava.util.Map;

importcom.google.common.collect.Maps;

importcom.google.common.io.Closeables;

importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.fs.FileSystem;

importorg.apache.hadoop.fs.Path;

importorg.apache.hadoop.io.SequenceFile;

importorg.apache.hadoop.util.ToolRunner;

importorg.apache.mahout.common.AbstractJob;

importorg.apache.mahout.common.HadoopUtil;

importorg.apache.mahout.common.commandline.DefaultOptionCreator;

importorg.apache.mahout.utils.io.ChunkedWriter;

2)执行转化命令

$MAHOUT0P6_HOME/bin/mahoutseqdirectory -c UTF-8 -i DataTrans/Text/text.data -o DataTrans/Text/seq_text

3)读取结果

$MAHOUT0P6_HOME/bin/mahoutseqdumper -s DataTrans/Numeric/Text/seq_text/chunk-0 -o/home/zhongchao/workspace/data/DataTrans/Text/res_text

结果如下:

Input Path:DataTrans/Text/seq_text/chunk-0

Key class: classorg.apache.hadoop.io.Text Value Class: class org.apache.hadoop.io.Text

Key:/seq_text/chunk-0: Value:

Key: /text.data:Value: package org.apache.mahout.text;

importjava.lang.reflect.Constructor;

importjava.nio.charset.Charset;

importjava.util.Map;

importcom.google.common.collect.Maps;

importcom.google.common.io.Closeables;

importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.fs.FileSystem;

importorg.apache.hadoop.fs.Path;

importorg.apache.hadoop.io.SequenceFile;

importorg.apache.hadoop.util.ToolRunner;

importorg.apache.mahout.common.AbstractJob;

importorg.apache.mahout.common.HadoopUtil;

importorg.apache.mahout.common.commandline.DefaultOptionCreator;

importorg.apache.mahout.utils.io.ChunkedWriter;

 

 

 

Count: 2

从中可以看出key为文件名,value为文件中的内容。

3 从SequenceFile中读取数字信息

3.1 简介

vectordump专门从SequenceFile中读取数字信息,其在包mahout-integration-0.6.jarorg.apache.mahout.utils.vectors

1.1.2-1VectorDumper命令行参数说明(VectorDumper类)

参数名称

参数解释

可选参数

默认值

-s

SequenceFile格式结果文件,在HDFS文件系统

 

-o

转换后的结果文件,文本格式,如果不设置该项,结果将打印到控制台,在本地

 

-u

如果key是向量,可以使用这个参数控制其输出

 

 

-p

如果-u参数给定,使用-p控制控制键按照空格分隔输出键

 

 

-d

 

 

 

-dt

字典文件格式

text/sequenefile

 

-c

输出向量的格式按照csv格式

     

   

-ac

如果用csv格式输出时,用此参数可以给每行向量信息加上一条说明信息(如结果文件中的说明信息:#eigenVector0, eigenvalue = 5888.20818554016

                                                  

        

-sort

 

 

 

-sz

 

 

 

-n

 

               

                                                            

-vs

 

 

 

-fi

 

 

 

-h

 

 

 

 

3.2 使用方式

见本章1.2节中第3)点。

 

 

 

4 从SequenceFile文件读取文本信息

4.1 简介

用seqdumper命令从SequenceFile文件中读取文本信息,其实现在mahout-example-0.6-job.jar中,org.apache.mahout.utils.SequenceFileDumper

命令行参数如下

表4.1-1 seqdumper 的执行参数

参数名称

参数解释

可选参数

默认值

--seqFile (-s) seqFile

输入路径在HDFS上

 

 

--output (-o) output

输出文件路径,在本地

 

 

--substring (-b) substring

The number of chars to print out per value

 

 

--count (-c)

Report the count only  

 

 

--numItems (-n) numItems

Output at most <n> key value pairs

 

 

--facets (-fa)    

Output the counts per key.  Note, if there are  a lot of unique keys, this can take up a fair amount of memory    

 

 

--help (-h)

Print out help

 

 

 

4.2 使用方式

见本章2.2节第3)点

 

5 将SequenceFile格式的文本文件转化为向量文件

5.1 简介

在对文本进行分类、聚类处理时,第一步是将文本文件转化为SequcnceFile格式,这在上面已经介绍了,本节介绍的是将SequenceFile格式的文件文件转化为向量化的SequenceFile格式。

使用seq2sparse命令可以完成此功能。其在mahout-example-0.6-job.jar包中,org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles

表5.1-1 seq2sparse向量化过程参数说明

参数名

说明

可选值

缺省值

  --input (-i) input

输入路径(转换为sequencefile格式的文本)

 

_

--output (-o) output   

输出路径

 

_

--chunkSize (-chunk) chunkSiz

一次处理的数据块大小(MB)

 

100

--analyzerName (-a) analyzerName

指定使用的分词器(org.apache.lucene.analysis.standard.StandardAnalyzer、org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer)

 

org.apache.lucene.analysis.standard.StandardAnalyzer

--minSupport (-s) minSupport

词频大于minSupport的词才会成为特征词

 

2

--minDF (-md) minDF

DF值小于minDF的单词计算tfidf值时将使用minDF计算,而不是原来的DF值。

 

1

--maxDFPercent (-x) maxDFPercent

去除在%maxDFPercent的文档中都出现的词

 

99

--weight (-wt) weight

向量化的方法(tf、tfidf)

 

tfidf

--norm (-n) norm 

按指定的范数进行规范化

 

0

--minLLR (-ml) minLLR

当maxNGramSize>1时起作用,可以去除不常用的单词组合

 

1.0

--numReducers (-nr) numReducers

指定reduce数目

 

1

--maxNGramSize (-ng) ngramSize

指定ngrams

 

1

--overwrite (-ow) 

如指定,则覆盖上次执行结果

 

_

--sequentialAccessVector (-seq)

如指定,则输出结果使用连续访问效率较高的向量SequentialAccessSparseVectors,否则使用默认

 

RandomAccessSparseVectors

--namedVector (-nv)

如指定,则输出结果向量类型为nameVector

 

false

--logNormalize (-lnorm)

(Optional) Whether output vectors should  be logNormalize. If set true else false

 

false

--maxDFSigma (-xs) maxDFSigma

What portion of the tf (tf-idf) vectors   to be used, expressed in times the  standard deviation (sigma) of the document frequencies of these vectors.    Can be used to remove really high frequency terms. Expressed as a double  value. Good value to be specified
is 3.0.  In case the value is less then 0 no vectors will be filtered out. Default is -1.0. Overrides maxDFPercent         

 

 

 

5.2 使用方式

见第八部分,2.1.1节。

抱歉!评论已关闭.