Dataframe к части кода RDD не работает - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь прочитать каждую строку информационного кадра и преобразовать данные строки в пользовательский класс EJB. Но проблема в том, что код не выполняется. Для проверки я написал несколько операторов печати, но ни один из операторов печати, присутствующих внутри df.rdd.map{row=>}, не выполнялся так, как если бы был завершен весь блок кода.

фрагмент кода:

 print("data frame:", df.show()). 

 df.rdd.map(row => {
   // Debugging
   println("Debugging")

  if(row.isNullAt(0)) {
    println("null data")
  } else {
    println(row.get(0).toString)
  }

  val employeeJobData = new EmployeeJobData

  if(row.get(0).toString == null || row.get(0).toString.isEmpty){
    employeeJobData.setEmployeeId("NULL_KEY_VALUE")
  } else {
    employeeJobData.setEmployeeId(row.get(0).toString)
  }
  employeeJobDataList.add(employeeJobData)
  } )

вывод из df.show():

   |employee_id|employee_name|employee_email|paygroup|level|dept_id|
   +-----------+-------------+--------------+--------+-----+-------+
   |13         |         null|          null|    null| null|   null|
   |14         |         null|          null|    null| null|   null|
   |15         |         null|          null|    null| null|   null|
   |16         |         null|          null|    null| null|   null|
   |17         |         null|          null|    null| null|   null|
   +-----------+-------------+--------------+--------+-----+-------+

1 Ответ

0 голосов
/ 02 мая 2020

Вы можете удалить ненужный код, как показано ниже, и получить java.util.List[EmployeeJobData], как показано ниже.

import java.util

object MapToCaseClass {

  def main(args: Array[String]): Unit = {
    val spark = Constant.getSparkSess;

    import spark.implicits._

    val df  = List((12,"name","email@email.com","paygroup","level","dept_id")).toDF()
    val employeeList : util.List[EmployeeJobData] = df
      .map(row => {
        val id = if (null == row.getString(0) || "null".equals(row.getString(0)) || row.getString(0).trim.isEmpty) {
          "NULL_KEY_VALUE"
        } else {
          row.getString(0)
        }
        EmployeeJobData(id, row.getString(1), row.getString(2),
          row.getString(3), row.getString(4), row.getString(5))
      })
      .collectAsList
  }

}

case class EmployeeJobData(employee_id: String, employee_name: String,employee_email: String,paygroup: String,
                           level: String,dept_id: String)

. Вышесказанное можно улучшить, просто задав тип данных employee_id и dept_id (т. Е. Если его цифры c) до Long. Этого "null".equals и .isEmpty() можно избежать для employee_id, а код можно дополнительно уменьшить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...