首页 > 解决方案 > 按列分组和排序 csv 文件 spark

问题描述

下面是我正在处理的 csv 文件示例:

life id,policy id,benefit id,date of commencment,status
xx_0,0,0,11/11/2017,active
xx_0,0,0,12/12/2017,active
axb_0,1,0,10/01/2015,active
axb_0,1,0,11/10/2014,active
fxa_2,0,1,01/02/203,active

我想要做的是 groupby ( lifeid+ policyid+benefitid)并按日期排序,然后对每个组的最近(最后一个)元素进行一些控制。

在火花上做到这一点的最佳方法是什么?

标签: javaapache-sparkapache-spark-sql

解决方案


在 spark 中执行此操作的最佳方法可能是使用数据帧(请参阅如何选择每个组的第一行?)。然而我读到你想避免使用它们。一个纯 RDD 解决方案可以写成如下:

val rdd = sc.parallelize(Seq("xx_0,0,0,11/11/2017,active",
    "xx_0,0,0,12/12/2017,active",
    "axb_0,1,0,10/01/2015,active",
    "axb_0,1,0,11/10/2014,active",
    "fxa_2,0,1,01/02/203,active"))

rdd
    .map(_.split(","))
    .map(x=> x.slice(0,3).reduce(_+","+_) -> 
        (new SimpleDateFormat("dd/MM/yyyy").parse(x(3)).getTime, x(4)))
    .reduceByKey((a,b) => if(a._1 > b._1) a else b)
    .map(x=> x._1+","+x._2._1+","+x._2._2)
    .collect.foreach(println)

推荐阅读