我想打印1991年以前加入的员工的数据。以下是我的样本数据:
69062,FRANK,ANALYST,5646,1991-12-03,3100.00,,2001
63679,SANDRINE,CLERK,69062,1990-12-18,900.00,,2001
加载数据的初始rdd:
val rdd=sc.textFile("file:////home/hduser/Desktop/Employees/employees.txt").filter(p=>{p!=null && p.trim.length>0})
用于将字符串列转换为日期列的自定义项:
def convertStringToDate(s: String): Date = {
val dateFormat = new SimpleDateFormat("yyyy-MM-dd")
dateFormat.parse(s)
}
将每个列Map到其数据类型:
val dateRdd=rdd.map(_.split(",")).map(p=>(if(p(0).length >0 )p(0).toLong else 0L,p(1),p(2),if(p(3).length > 0)p(3).toLong else 0L,convertStringToDate(p(4)),if(p(5).length >0)p(5).toDouble else 0D,if(p(6).length > 0)p(6).toDouble else 0D,if(p(7).length> 0)p(7).toInt else 0))
现在我得到元组中的数据,如下所示:
(69062,FRANK,ANALYST,5646,Tue Dec 03 00:00:00 IST 1991,3100.0,0.0,2001)
(63679,SANDRINE,CLERK,69062,Tue Dec 18 00:00:00 IST 1990,900.0,0.0,2001)
现在,当我执行命令时,我得到以下错误:
scala> dateRdd.map(p=>(!(p._5.before("1991")))).foreach(println)
<console>:36: error: type mismatch;
found : String("1991")
required: java.util.Date
dateRdd.map(p=>(!(p._5.before("1991")))).foreach(println)
^
那我哪里做错了???
2条答案
按热度按时间shyt4zoc1#
由于您使用的是rdd,而不是df,并且您有带有简单日期检查的日期字符串,因此以下是rdd的非复杂方式:
gg0vcinb2#
无需将日期转换为传统的simpledate格式。使用java.time。因为第4列是iso期望的格式,所以您可以简单地使用下面的rdd步骤。看看这个
这个
给出了以下结果
希望这能回答你的问题。
编辑1:
使用Java7和simpleformat库