快速摘要:
我正在尝试使用Scala中的Vegas-viz显示Spark DataFrames中的多个直方图。我创建了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
调用图之前,我试图评估val evaluate: Long = group.rdd.count()
DataFrame,但是它不能解决问题。
答案 0 :(得分:0)
通过使变量plot
惰性来解决它。仍然不确定这是否是最好的想法。