Печать данных обычно без массива массивов в спарк RDD - PullRequest
0 голосов
/ 26 сентября 2018

У меня ниже образец данных:

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) Загруженные данные в СДР:

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. Так где же я иду не так?Или это нормально, если данные печатаются в виде массива массива ??Это действительно с точки зрения сертификации ??Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Вы можете попробовать следующий фрагмент:

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. "!"Оператор в функции фильтра вернет true, если dept_id не 2001. Пример ввода, который я рассматриваю, приведен ниже:

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
0 голосов
/ 26 сентября 2018

Итак, наконец, после тяжелой битвы я нашел решение своей проблемы.Ниже приведен рабочий код:

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) Загрузить СДР:

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

3) Сопоставить класс дела с СДР:

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)  

Я также ценю усилия других людей, которые старались изо всех сил помочь мне.Ура!

0 голосов
/ 26 сентября 2018

Для простоты вы можете просто добавить еще одно выражение && в свое первоначальное выражение, так как

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

Надеюсь, ответ полезен

...