spark sbt error:值toDF不是Seq [DataRow]的成员

时间:2017-05-23 20:49:43

标签: apache-spark apache-spark-sql spark-dataframe

我有一些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论坛中的一些答案),但无论我如何构建代码,都无法使其工作。

如何让它发挥作用?任何帮助都非常受欢迎。

1 个答案:

答案 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
    //
  }
}

我花了一段时间来处理这个答案,但它在那里。