如何使用java Spark编码从CSV文件中选择3列,还可以分组并最终求和

如何使用java Spark编码从CSV文件中选择3列,还可以分组并最终求和,java,apache-spark,spark-streaming,cloudera,Java,Apache Spark,Spark Streaming,Cloudera,我是Spark的新手,我想编写Spark Java程序,就像我必须加载包含75列和140万行的CSV文件一样。当给文件时,我们必须只选择3列,我必须为此编写给定条件,我必须对1列执行groupbykey,我必须对另一列进行求和。将CSV文件放入spark的最简单方法是使用spark CSV包运行它 本网页上的示例应能满足您的需要,只需几行: 根据您正在运行的Spark版本(1.3或1.4),您可以使用Datatricks Spark csv软件包加载csv文件,其中包括: 火花1.3 val d

我是Spark的新手,我想编写Spark Java程序,就像我必须加载包含75列和140万行的CSV文件一样。当给文件时,我们必须只选择3列,我必须为此编写给定条件,我必须对1列执行groupbykey,我必须对另一列进行求和。将CSV文件放入spark的最简单方法是使用spark CSV包运行它

本网页上的示例应能满足您的需要,只需几行:


根据您正在运行的Spark版本(1.3或1.4),您可以使用Datatricks Spark csv软件包加载csv文件,其中包括:

火花1.3

val df = sqlContext.load("com.databricks.spark.csv", Map("path" -> filePath,"header"->"true"))
火花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 8的一部分Java LocalDate。如果您愿意,可以使用JodaTime。)

假设您只需要日期晚于(比如2015年5月24日)的行,您可以使用筛选器除去不需要的行

val startDate = LocalDate.of(2015,5,24)
val filteredData = allData.filter{case(_,_,date) => date.isAfter(startDate)}
现在,要对每个ID的特定列求和,您需要将数据映射到键值对(ID,amount),然后使用
reduceByKey对金额求和

filteredData.map{case(id,amount, _) => (id, amount)}
            .reduceByKey(_ + _)

这就是您想要的吗?

谢谢您的回复,但请您发送程序或任何链接,我不确定我是否理解。你在找哪个程序?嗨,Any 1,请告诉我,我在Mapreduce中有这个逻辑java,我怎样才能用Sark java编写。