Hadoop中的CSV处理

我在csv文件中有6个字段:

  • 首先是学生姓名( String
  • 其他是学生的标记,如主题1,主题2等

我在java中编写mapreduce ,用逗号分割所有字段,并在键中发送学生姓名,并在地图值中标记。

reduce我正在处理他们输出密钥中的学生姓名和theres标记加上减去的总值,平均值等。

我认为可能有一种替代的,更有效的方法来做到这一点。

有没有人知道更好的方法来做这些操作?

是否有任何内置function的hadoop可以按学生姓名分组,并且可以计算与该学生相关的总分和平均值?

您可能需要查看Pig http://pig.apache.org/ ,它在Hadoop之上提供了一种简单的语言,允许您使用短的代码执行许多标准任务。

使用HIVE。比在java中编写mapreduce更简单,可能比PIG更熟悉,因为它是SQL语法。

https://cwiki.apache.org/confluence/display/Hive/Home

您需要做的是1)在您的计算机或1个节点中安assembly置单元客户端并将其指向您的集群。 2)为该文件创建表描述3)加载数据4)编写SQL。 由于它认为您的数据看起来像student_name,subject_mark1,subject_mark2等,您可能需要使用explode https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-explode

2)CREATE TABLE学生(姓名STRING,subject1 INT,subject2 INT)行格式删除字段由’,’作为序列文件存储;

3)LOAD DATA INPATH’/ path/to/data/students.csv’INTO TABLE学生;

4)SELECT名称,AVG(subject1),AVG(subject2)FROM学生GROUP BY名称;

输出可能如下所示:

NAME | SUBJECT1 | 主题2

约翰| 6.2 | 7

汤姆| 3.5 | 5

除了作为减速器运行之外,您还可以将减速器设置为组合器 ,以便在将所有减速器发送到减速器之前执行临时计算。

正如Nicolas78所说,你应该考虑看猪,它可以很好地构建一个有效的地图/减少并节省你的代码和努力

我在java中编写mapreduce,用逗号分割所有字段,并在键中发送学生姓名,并在地图值中标记。

在减少我正在处理他们输出密钥中的学生姓名和theres标记加上减去的总值,平均值等。

这可以很容易地写成仅限地图的工作,不需要减速器。 一旦映射器从CSV中获取一行,就将它们拆分并仅根据映射器中的需要进行计算。 并将学生姓名作为关键字,平均/总数等作为值。