Вложенный 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
ленивый. До сих пор не уверен, что это лучший способ мыслить.