通常在Spark RDD中打印数据而没有数组数组

时间:2018-09-26 11:54:57

标签: scala apache-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类映射它,但输出如下所示:

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的记录。那我在哪里错了?还是以Array of Array形式打印数据可以吗?从认证角度来看有效吗?预先感谢

3 个答案:

答案 0 :(得分:1)

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

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

根据给定的输入,您不必遍历所有case类的内容,因为您的最终要求是

  
    

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

  

我希望答案会有所帮助

答案 1 :(得分:0)

您可以尝试以下代码段:

val testRDD = spark.sparkContext.textFile("D://testsample.txt");

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

val depRDD = testRDD.map(_.split(",")).map(p => employees(p(0).toLong, p(1), p(2), 
p(3).toLong, p(4), p(5).toDouble, p(6))).filter(!_.dep_id.equals("2001"));

depRDD.foreach(println)

这将为您提供所有没有dept_id 2001的行。当dept_id不是2001时,过滤器函数中的运算符将返回true。我认为的示例输入如下:

67832,CLARE,MANAGER,68319,1991-06-09,2550.00,1001
65646,JONAS,MANAGER,68319,1991-04-02,2957.00,2001
23459,SAMIK,MANAGER,68319,1991-08-12,2550.00,3001
67890,SUMAN,MANAGER,68319,1991-06-23,2957.00,2001

答案 2 :(得分:0)

因此,经过艰苦奋战,终于找到了解决问题的办法。下面是工作代码:

1)创建case class

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);

2)加载RDD:

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

3)具有RDD的地图案例类:

val employeesDf=rdd.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))  

4)应用转换:

employeesDf.filter(_.dep_id!=2001).foreach(println)  

我也感谢其他人尽力帮助我的努力。干杯!