我是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。提前感谢您的帮助。
编辑
答案是,Dataset
类的ofRows
方法是scala私有方法。但由于Scala/Java代码的自动转换,它可以从Java访问(并出现在Javadoc中)。因此,从技术上讲,我们不应该使用这种方法,但它可以通过Java API意外访问。我想执行逻辑计划更改,因为我正在尝试实现运行注入安全的动态SQL查询。但我会努力找到一种不那么棘手的方式来实现这个目标。
答案是,Dataset类的Rows方法是一个scala私有方法。但由于Scala/Java代码的自动转换,它可以从Java访问(并出现在Javadoc中)。因此,从技术上讲,我们不应该使用这种方法,但它可以通过Java API意外访问。我想执行逻辑计划更改,因为我正在尝试实现运行注入安全的动态SQL查询。但我会努力找到一种不那么棘手的方式来实现这个目标。