我有一些spark scala代码在spark-shell中没有问题。
这个问题的核心在于这几行。我想在数据框中添加一行:
object SparkPipeline {
def main(args: Array[String]) {
val spark = (SparkSession
.builder()
.appName("SparkPipeline")
.getOrCreate()
)
df = (spark
.read
.format("com.databricks.spark.avro")
.load(DATA_PATH)
)
case class DataRow(field1: String, field2: String)
val row_df = Seq(DataRow("FOO", "BAR")).toDF() // THIS FAILS
val df_augmented = df.union(row_df)
//
// Additional code here
//
}
}
但是,当我使用sbt将其打包为jar时,sbt失败并出现以下错误:
value toDF is not a member of Seq[DataRow]
我按照this question尝试:
val spark = (SparkSession
.builder()
.appName("TrainSimpleRF")
.getOrCreate()
)
val sc = spark.sparkContext
val sqlContext= new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
哪个不能解决问题。还尝试导入spark.implicits_
无济于事。我在main方法中有所有代码。我认为这可能很重要(根据cloudera论坛中的一些答案),但无论我如何构建代码,都无法使其工作。
如何让它发挥作用?任何帮助都非常受欢迎。
答案 0 :(得分:5)
好的,我找到了解决方案,如this post中所述,我只需将类定义移到主函数之外,如:
// Define the class DataRow prior to the object with the main method
case class DataRow(field1: String, field2: String)
object SparkPipeline {
def main(args: Array[String]) {
val spark = (SparkSession
.builder()
.appName("SparkPipeline")
.getOrCreate()
)
df = (spark
.read
.format("com.databricks.spark.avro")
.load(DATA_PATH)
)
val row_df = Seq(DataRow("FOO", "BAR")).toDF() // THIS FAILS
val df_augmented = df.union(row_df)
//
// Additional code here
//
}
}
我花了一段时间来处理这个答案,但它在那里。