我是Spark的新手,我想编写Spark Java程序,就像我必须加载包含75列和140万行的CSV文件一样。在提供文件的同时我们只需要选择3列,我必须为此写出条件,我必须为1列执行groupbykey而且我必须完成另一列的总和
答案 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包运行它。
此网页上的示例应该可以满足您的需求,它应该只有几行: