hadoop下的Kmeans算法实现三

初始化中心点CenterInitial.java

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;


public class CenterInitial {
	
	
	public void run(String[] args) throws IOException
	{
		String[] clist;//用于保存中心点
		int k = 2;//中心点选取个数
		String string = "";//保存各个中心点在同一个字符串string中
		String inpath = args[0]+"/4.txt";  //cluster数据集放在2.txt中
		String outpath = args[1]+"/input2/3.txt";  //center新选取的中心点放进3.txt中保存
		Configuration conf1 = new Configuration(); //读取hadoop文件系统的配置
		conf1.set("hadoop.job.ugi", "hadoop,hadoop"); //配置信息设置
		FileSystem fs = FileSystem.get(URI.create(inpath),conf1); //FileSystem是用户操作HDFS的核心类,它获得URI对应的HDFS文件系统 
		FSDataInputStream in = null; 
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		try{ 
         
			in = fs.open( new Path(inpath) ); 
			IOUtils.copyBytes(in,out,50,false);  //用Hadoop的IOUtils工具方法来让这个文件的指定字节复制到标准输出流上 
			//把in读到的数据 复制到out上
			clist = out.toString().split(" ");//将out以空格为分割符转换成数组在clist中保存
			} finally { 
				IOUtils.closeStream(in);
			}
		
		FileSystem filesystem = FileSystem.get(URI.create(outpath), conf1); //获得URI对应的HDFS文件系统 
		
		for(int i=0;i<k;i++)
		{
			int j=(int) (Math.random()*100) % clist.length;//选取0到clist.lenth-1的随机数
			if(string.contains(clist[j]))  // 如果选取的是同一个随机数
			{
				k++;
				continue;
			}
			string = string + clist[j].replace(" ", "") + " ";//将得到的k个随机点的坐标用一个字符串保存
		}
		OutputStream out2 = filesystem.create(new Path(outpath) ); 
		IOUtils.copyBytes(new ByteArrayInputStream(string.getBytes()), out2, 4096,true); //把随机点坐标字符串out2中
		System.out.println("初始化过程:"+string);
	}

}



你可能感兴趣的:(hadoop下的Kmeans算法实现三)