如何使用java Spark编码从CSV文件中选择3列也分组并最后求和

时间:2015-09-04 10:56:00

标签: java apache-spark spark-streaming cloudera

我是Spark的新手,我想编写Spark Java程序,就像我必须加载包含75列和140万行的CSV文件一样。在提供文件的同时我们只需要选择3列,我必须为此写出条件,我必须为1列执行groupbykey而且我必须完成另一列的总和

2 个答案:

答案 0 :(得分:1)

根据您运行的Spark版本(1.3或1.4),您可以使用Databricks spark-csv软件包加载csv文件:

Spark 1.3

val df = sqlContext.load("com.databricks.spark.csv", Map("path" -> filePath,"header"->"true"))

Spark 1.4

val df = sqlContext.read.format("com.databricks.spark.csv").options(Map("path" -> filePath,"header"->"true")).load()

在下文中,我将假设您只对第2,3和32列感兴趣,并且第2列需要解析为日期,第3列是String类型的ID,第32列是需要的数量被解析为Double。

因此,一旦加载了文件,就可以得到如下的3列:

val allData = df.map(row => (row.getString(3), row.getString(32).toDouble, LocalDate.parse(row.getString(2), DateTimeFormatter.ISO_LOCAL_DATE))

(请注意,我使用的是Java LocalDate,它是Java 8的一部分。如果您愿意,可以使用JodaTime。)

假设您只希望日期晚于2015年5月24日的行,您可以使用过滤器来消除不需要的行

val startDate = LocalDate.of(2015,5,24)
val filteredData = allData.filter{case(_,_,date) => date.isAfter(startDate)}

现在,要为每个ID汇总一个特定列,您需要将数据映射到键值对(ID,金额),然后使用reduceByKey

对金额求和
filteredData.map{case(id,amount, _) => (id, amount)}
            .reduceByKey(_ + _)

这是你想要的吗?

答案 1 :(得分:0)

将CSV文件转换为spark的最简单方法是使用spark-csv包运行它。

此网页上的示例应该可以满足您的需求,它应该只有几行:

https://github.com/databricks/spark-csv

相关问题