我的数据样本如下:
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形式打印数据可以吗?从认证角度来看有效吗?预先感谢
答案 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)
我也感谢其他人尽力帮助我的努力。干杯!