分享

java 怎么读取hdfs上csv文件的某一列

xintuhai 发表于 2016-3-14 14:46:34 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 12 30938
java 怎么读取hdfs上csv文件的某一列
我想对某一列数进行处理,例如求均值。急诊!

已有(12)人评论

跳转到指定楼层
wscl1213 发表于 2016-3-14 15:30:29
这是读取数组,下面是在第12列数据统一加前缀"V",下面例子,希望对楼主有帮助
 java读取csv文件,按照指定格式:
  [mw_shl_code=java,true]import java.io.IOException;
  import java.nio.charset.Charset;
  import java.util.ArrayList;
  import com.csvreader.CsvReader;
  import com.csvreader.CsvWriter;
  /**
  * 读取CSV文件
  * 所谓"CSV",是Comma Separated Value(逗号分隔值)的英文缩写,通常都是纯文本文件。
  * 可以看成数据库程序与电子表格之间一种中间通信文件,数据库可以导出。csv格式,excel也可以导入并打开。csv文件,例子如下
  * sj_mino1001.jpg,715282,4FB55FE8,
  * sj_mino1002.jpg,471289,93203C5C,
  * sj_mino1003.jpg,451929,C4E80467,
  *
  */
  public class CSVDeal{
  public static void main(String[] args) {
  try {
  String[] stringList;
  String csvFilePath = "C:\\Users\\Administrator\\Desktop\\20140227135936.csv";
  String sourceFileString= "C:\\Users\\Administrator\\Desktop\\test.csv";
  CsvReader reader = new CsvReader(csvFilePath); //默认是逗号分隔符,UTF-8编码
  CsvWriter writer = new CsvWriter(sourceFileString);
  /*
  * readRecord()判断是否还有记录,getValues()读取当前记录,然后指针下移
  */
  reader.readRecord();
  writer.writeRecord(reader.getValues()); //读取表头
  /*
  * 逐行读取,以免文件太大
  * 处理表头后面的数据,这里是在第12列数据统一加前缀"V"
  */
  while(reader.readRecord()){
  stringList = reader.getValues();
  stringList[11] = 'V' + stringList[11];
  writer.writeRecord(stringList);
  }
  reader.close();
  writer.close();
  }catch(Exception ex){
  System.out.println(ex);
  }
  }
  }[/mw_shl_code]







回复

使用道具 举报

szcountryboy 发表于 2016-3-14 16:34:57
只能把文件取道本地,然后再读取把,或者使用mr将需要处理的那一列单独输出到一个文件
还有更好的解决方法?
回复

使用道具 举报

xintuhai 发表于 2016-3-14 21:32:44
wscl1213 发表于 2016-3-14 15:30
这是读取数组,下面是在第12列数据统一加前缀"V",下面例子,希望对楼主有帮助
 java读取csv文件,按照指 ...

我要对HDFS上的csv文件的某一列求均值处理。这样的路径是本地的路径还是HDFS上的路径呢?还是直接用MapReduce对HDFS上的csv某列求均值呢?好像不需要java吧。这里不是很懂
回复

使用道具 举报

xintuhai 发表于 2016-3-14 21:33:44
szcountryboy 发表于 2016-3-14 16:34
只能把文件取道本地,然后再读取把,或者使用mr将需要处理的那一列单独输出到一个文件
还有更好的解决方法?

应该是直接用MapReduce对csv数据处理。求某一列的均值,方差
回复

使用道具 举报

s060403072 发表于 2016-3-14 22:11:36
xintuhai 发表于 2016-3-14 21:33
应该是直接用MapReduce对csv数据处理。求某一列的均值,方差

楼主首先要懂mapreduce编程。
然后换成hdfs路径,其它都是一样的
回复

使用道具 举报

xintuhai 发表于 2016-3-15 20:00:33
s060403072 发表于 2016-3-14 22:11
楼主首先要懂mapreduce编程。
然后换成hdfs路径,其它都是一样的

map上面没有自带的读取CSV的类吧(我没有找到)。我按照网上例子,自己继承InputFormat类,写了一个CSVInputFormat,但是读取的时候提示Input path does not exist: file:/out/acc_00001.csv,这是怎么回事呢?
problem.jpg
回复

使用道具 举报

s060403072 发表于 2016-3-15 20:03:28
xintuhai 发表于 2016-3-15 20:00
map上面没有自带的读取CSV的类吧(我没有找到)。我按照网上例子,自己继承InputFormat类,写了一个CSVIn ...

你这是本地路径,应该是hdfs路径
回复

使用道具 举报

xintuhai 发表于 2016-3-15 20:12:46
s060403072 发表于 2016-3-15 20:03
你这是本地路径,应该是hdfs路径

这个是HDFS文件吧,路径是好像这样表示的
22.png
回复

使用道具 举报

xuanxufeng 发表于 2016-3-15 20:30:56
xintuhai 发表于 2016-3-15 20:12
这个是HDFS文件吧,路径是好像这样表示的

权限有问题,楼主给下面对比下,授下权
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条