调用数据集静态方法在Spark Shell中不起作用

时间:2017-11-07 03:01:35

标签: scala apache-spark dataset apache-spark-sql

我是Scala的新手,所以如果解决方案很简单,我会提前道歉。

我正在尝试在Spark Shell中执行查询,我正在修改数据集的逻辑计划。以下是我正在努力的代码示例:

import org.apache.spark.sql._

val newPlan = ...
val newDS = Dataset.ofRows(spark, newPlan)

当我运行时,我收到以下错误消息:

<console>:41: error: not found: value Dataset
   val newDS = Dataset.ofRows(spark, newPlan)

尝试在声明中指定包时:

scala> val newDS = org.apache.spark.sql.Dataset.ofRows(spark, newPlan)

我明白了:

<console>:41: error: object Dataset in package sql cannot be accessed in package org.apache.spark.sql
       val newDS = org.apache.spark.sql.Dataset.ofRows(spark, newPlan)

我还尝试了import org.apache.spark.sql.Datasetimport org.apache.spark.sql.Dataset._import org.apache.spark.sql.Dataset.*但这些都没有。

我正在使用Spark 2.1.0。提前感谢您的帮助。

修改

答案是,ofRows类的Dataset方法是scala私有方法。但是可以从Java访问它,因为自动转换Scala / Java代码(并出现在Javadoc中)。 因此,从技术上讲,我们不应该使用此方法,但是通过Java API可以意外地访问它。 我想执行逻辑计划更改,因为我正在尝试实现运行注入安全的动态SQL查询。但我会尝试找到一种不那么愚蠢的方法来实现这一目标。

1 个答案:

答案 0 :(得分:1)

答案是,Dataset类的ofRows方法是scala私有方法。但是由于可以自动转换Scala / Java代码(并且出现在Javadoc中),因此可以从Java访问它。因此,从技术上讲,我们不应该使用此方法,但是可以通过Java API意外地访问它。我想执行逻辑计划更改,因为我正在尝试实现运行注入安全的动态SQL查询。但是,我将尝试找到一种不太麻烦的方法来实现这一目标。