调用Vegas-viz .withDataFrame时嵌套的Spark DataFrame

时间:2018-09-05 15:00:09

标签: scala apache-spark vegas-viz

快速摘要: 我正在尝试使用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,但是它不能解决问题。

1 个答案:

答案 0 :(得分:0)

通过使变量plot惰性来解决它。仍然不确定这是否是最好的想法。