首页 > 解决方案 > 在 spark RDD 中正常打印数据而没有数组数组

问题描述

我有以下数据样本:

67832,CLARE,MANAGER,68319,1991-06-09,2550.00,,1001
65646,JONAS,MANAGER,68319,1991-04-02,2957.00,,2001  

我想获取最后一列数据所在的数据NOT EQUAL to 2001.所以我尝试了以下步骤

1)RDD中加载的数据:

val employeesRdd=sc.textFile("file:///home/cloudera/Desktop/Employees/employees.txt").filter(p=>{p.length > 0 && p!=null})  

2)执行转换:

如果我像下面这样修改我的代码,那么它会给出字符串数组的数组,但我希望它像普通数据一样打印为输入数据集。

employeesRdd.map(_.split(",")).filter(p=>!(p(7)="2001")).collect  

3)即使我尝试用案例类映射它,但得到的输出如下所示:

case class employees(emp_id:java.lang.Long,emp_name:String, job_name:String,manager_id:java.lang.Long,hire_date:String,salary:java.lang.Double,commision:java.lang.Double,dep_id:java.lang.Long);

val employeesRdd1=employeesRdd.map(_.split(",")).map(p=>employees(if(p(0).length>0)p(0).toLong else 0L,p(1),p(2),if(p(3).length>0) p(3).toLong else 0L,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).toLong else 0L)).toDF()  

employeesRdd1.foreach(println):

映射后的数据样本输出:

employees(67832,CLARE,MANAGER,68319,1991-06-09,2550.00,,1001)
employees(65646,JONAS,MANAGER,68319,1991-04-02,2957.00,,2001)

在这种情况下如何访问元素。我也尝试了下面的示例代码,但它抛出了一个error that _1 is not a member of String

employeesRdd1.map(_._1).first

所以重点是我想像输入数据一样以正常形式打印,但没有最后一列的记录!= 2001。那么我哪里出错了?或者如果数据以数组形式打印可以吗?从认证的角度来看是否有效?提前致谢

标签: scalaapache-sparkrdd

解决方案


为简单起见,您可以&&在初始表达式中再添加一个表达式

val employeesRdd=sc.textFile("file:///home/cloudera/Desktop/Employees/employees.txt").filter(p=>{p.length > 5 && p!=null && !p.substring(p.length-5).contains("2001")})
employeesRdd.foreach(println)  

会给你

67832,CLARE,MANAGER,68319,1991-06-09,2550.00,,1001

从给定的输入中,您不必遍历所有案例类的东西,因为您的最终要求是

重点是我想像输入数据一样以正常形式打印,但没有最后一列的记录!= 2001

我希望答案有帮助


推荐阅读