2016-12-14 2 views
1

Ich versuche, Funken-Dataset (Funke 2.0.1) zu lernen. Unterhalb des linken äußeren Joins wird eine Nullzeiger-Ausnahme erstellt.Null-Zeiger-Ausnahme - Apache Spark Dataset linken äußeren Join

case class Employee(name: String, age: Int, departmentId: Int, salary: Double) 
case class Department(id: Int, depname: String) 
case class Record(name: String, age: Int, salary: Double, departmentId: Int, departmentName: String) 
val employeeDataSet = sc.parallelize(Seq(Employee("Jax", 22, 5, 100000.0),Employee("Max", 22, 1, 100000.0))).toDS() 
val departmentDataSet = sc.parallelize(Seq(Department(1, "Engineering"), Department(2, "Marketing"))).toDS() 

val averageSalaryDataset = employeeDataset.joinWith(departmentDataSet, $"departmentId" === $"id", "left_outer") 
           .map(record => Record(record._1.name, record._1.age, record._1.salary, record._1.departmentId , record._2.depname)) 

averageSalaryDataset.show() 

16/12/14 16:48:26 ERROR Executor: Ausnahme in Aufgabe 0.0 in der Stufe 2.0 (TID 12) java.lang.NullPointerException

Dies liegt daran, während die äußere linke Tun Join gibt null Werte für record._2.depname.

Wie geht das? Dank

Antwort

0

Gelöst dies durch die Verwendung ---

val averageSalaryDataset1 = employeeDataSet.joinWith(departmentDataSet, $"departmentId" === $"id", "left_outer").selectExpr("nvl(_1.name, ' ') as name","nvl(_1.age, 0) as age","nvl(_1.salary, 0.0D) as salary","nvl(_1.departmentId, 0) as departmentId","nvl(_2.depname, ' ') as departmentName").as[Record] 
averageSalaryDataset1.show() 
+0

Obwohl dies wahrscheinlich funktioniert es eine sehr schlechte Lösung ist.! o ich verstehe nicht, warum die Verbindung nicht eine Option, die zurück von die Fallklasse, so dass es leicht zu überprüfen ist. – Sparky

0

null gehandhabt werden kann if..else Zustand verwendet wird.

val averageSalaryDataset = employeeDataSet.joinWith(departmentDataSet, $"departmentId" === $"id", "left_outer").map(record => Record(record._1.name, record._1.age, record._1.salary, record._1.departmentId , if (record._2 == null) null else record._2.depname)) 

Nach der Operation kommen, werden die resultierenden Daten-Set Spalten als Karte (Schlüssel-Wert-Paare), und in der Karte Betrieb gespeichert, wir sind die Schlüssel nennen, aber der Schlüssel ist „null‘, wenn Sie Datensatz aufrufen. _2.depName weshalb die Ausnahme

val averageSalaryDataset = employeeDataSet.joinWith(departmentDataSet, $"departmentId" === $"id", "left_outer") 

Dataset after left join

Verwandte Themen