数据框架到RDD这段代码无法工作。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据框架到RDD这段代码无法工作。相关的知识,希望对你有一定的参考价值。

我试图读取数据框架的每一行,并将行数据转换为自定义Bean类。但问题是,代码没有被执行。为了检查,我写了多条打印语句,但没有一条打印语句存在于 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|
   +-----------+-------------+--------------+--------+-----+-------+
答案

你可以删除不必要的代码,如下所示,并获得 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_iddept_idLong . 这个 "null".equals.isEmpty() 免得 employee_id 和代码可以进一步减少。

以上是关于数据框架到RDD这段代码无法工作。的主要内容,如果未能解决你的问题,请参考以下文章

这段代码有问题吗?我无法让它工作。请帮帮我[关闭]

RDD 序列化

无法使用 customSchema 将 RDD 转换为 DF

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]

以下代码片段 C++ 的说明

如何理解这段代码片段中的两对括号?