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