NullPointerException на DataFrame, где - PullRequest
0 голосов
/ 10 января 2019

У меня есть следующий метод, написанный на Scala:

def fillEmptyCells: Unit = {
    val hourIndex = _weather.schema.fieldIndex("Hour")
    val dateIndex = _weather.schema.fieldIndex("Date")
    val groundSurfaceIndex = _weather.schema.fieldIndex("GroundSurface")
    val snowyGroundIndex = _weather.schema.fieldIndex("SnowyGroundSurface")
    val precipitationIndex = _weather.schema.fieldIndex("catPrec")
    val snowDepthIndex = _weather.schema.fieldIndex("catSnowDepth")

    var resultDf : DataFrame = sparkSession.createDataFrame(sparkSession.sparkContext.emptyRDD[Row],_weather.schema)

    val days = _weather.select("Date").distinct().rdd
    _weather.where("Date = '2014-08-01'").show()
    days.foreach(x => {
      println(s"Date = '${x.getDate(0)}'")
      _weather.where(s"Date = '${x.getDate(0)}'").show()
      val day = _weather.where(s"Date = '${x.getDate(0)}'")
      val dayValues = day.where("Hour = 6").first()
      val grSur = dayValues.getString(groundSurfaceIndex)
      val snSur = dayValues.getString(snowyGroundIndex)
      val prec = dayValues.getString(precipitationIndex)
      val snowDepth = dayValues.getString(snowDepthIndex)
      val dayRddMapped = day.rdd.map(y => (y(0), y(1), grSur, snSur, y(4), y(5), y(6), y(7), prec, snowDepth))
        .foreach(z => {
          resultDf = resultDf.union(Seq(z).toDF())
        })
    })
    resultDf.show(20)
    Unit
  }

Проблема в этой строке: _weather.where(s"Date = '${x.getDate(0)}'").show(), где встречается NullPointerException. Как видно из приведенной выше строки, я печатаю предложение where для консоли (оно выглядит как Date = '2014-06-03'), а строка непосредственно перед foreach принимает один из выходных данных в качестве параметров и работает нормально. _weather является переменной класса и не изменяется во время работы этого метода. Отладчик показывает больше странных вещей: _weather получает null ed после первой итерации.

Каков источник этой магии и как я могу избежать ее?

Более того, если у вас есть предложения по архитектуре и качеству кода, добро пожаловать здесь

StackTrace:

java.lang.NullPointerException
    at org.apache.spark.sql.Dataset.where(Dataset.scala:1344)
    at org.[package].WeatherHelper$$anonfun$fillEmptyCells$1.apply(WeatherHelper.scala:148)
    at org.[package].WeatherHelper$$anonfun$fillEmptyCells$1.apply(WeatherHelper.scala:146)
    at scala.collection.Iterator$class.foreach(Iterator.scala:893)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
    at org.apache.spark.rdd.RDD$$anonfun$foreach$1$$anonfun$apply$28.apply(RDD.scala:918)
    at org.apache.spark.rdd.RDD$$anonfun$foreach$1$$anonfun$apply$28.apply(RDD.scala:918)
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2062)
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2062)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
    at org.apache.spark.scheduler.Task.run(Task.scala:108)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:335)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
19/01/10 13:39:35 ERROR Executor: Exception in task 6.0 in stage 10.0 (TID 420)

Имя класса WeatherHelper это просто часть всей трассировки стека, которая повторяется ~ 20 раз.

1 Ответ

0 голосов
/ 10 января 2019

вы не можете использовать кадры данных в коде RDD (вы используете кадры данных в days.foreach), здесь эти кадры данных равны нулю, поскольку они существуют только в драйвере, но не в исполнителях

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