Вложенный Spark DataFrame при вызове Vegas-viz .withDataFrame

Краткое резюме: я пытаюсь отобразить несколько гистограмм из Spark DataFrames с помощью Vegas-viz в Scala. Я создал trait создавать различные типы гистограмм и реализовывать классы, расширяющие их. Когда я создаю экземпляр дочернего класса, я получаю NullPointerException что заставляет меня думать, что где-то есть вложенный DataFrame.

Есть ли обходной путь? Я что-то пропустил, а ошибка что-то еще?

Детали: вот trait:

trait Histogram {

  val rawdf: DataFrame
  val sparseDim: Seq[String]
  val name: String

  val xColumn: String
  val yColumn: String

  val group: DataFrame

  val plot: ExtendedUnitSpecBuilder = Vegas(name).
    withDataFrame(group).
    encodeX(
      field = xColumn,
      Quantitative,
      scale = Scale(ScaleType.Log),
      title = sparseDim.reduce((a, b) => a + ", " + b)
    ).
    encodeY(field = yColumn, Quantitative).
    mark(Bar)

  def show(): Unit = plot.show

}

И вот один из классов, расширяющих его:

class HistogramCount(val rawdf: DataFrame,
                     val sparseDim: Seq[String],
                     val name: String = "Histogram Count") extends Histogram {

  val xColumn = "cube"
  val yColumn = "count"

  override val group: DataFrame = rawdf.
    select("VALUE", sparseDim: _*).
    groupBy(sparseDim.head, sparseDim.tail: _*).
    count().
    withColumnRenamed("count", "cube").
    groupBy("cube").
    count()

}

Когда я создаю экземпляр дочернего класса, возникает следующая ошибка:

Exception in thread "main" java.lang.NullPointerException
at <Pointing to .withDataFrame(group) in the trait>

Я думаю, это потому, что оценка group ленив и что это называется в .withDataFrame(group) когда plot создано.

Я пытался оценить group DataFrame перед вызовом сюжета с val evaluate: Long = group.rdd.count(), но это не решает проблему.

1 ответ

Решил это, сделав переменную plot ленивый. До сих пор не уверен, что это лучший способ мыслить.

Другие вопросы по тегам