scala – 对于基本数据框创建示例,我应该如何在Spark中编写单元
我正在努力编写一个基本单元测试来创建数据框,使用Spark提供的示例文本文件,如下所示.
class dataLoadTest extends FunSuite with Matchers with BeforeAndAfterEach { private val master = "local[*]" private val appName = "data_load_testing" private var spark: SparkSession = _ override def beforeEach() { spark = new SparkSession.Builder().appName(appName).getOrCreate() } import spark.implicits._ case class Person(name: String,age: Int) val df = spark.sparkContext .textFile("/Applications/spark-2.2.0-bin-hadoop2.7/examples/src/main/resources/people.txt") .map(_.split(",")) .map(attributes => Person(attributes(0),attributes(1).trim.toInt)) .toDF() test("Creating dataframe should produce data from of correct size") { assert(df.count() == 3) assert(df.take(1).equals(Array("Michael",29))) } override def afterEach(): Unit = { spark.stop() } } 我知道代码本身是有效的(来自spark.implicits._ …. toDF()),因为我已经在Spark-Scala shell中验证了这一点,但在测试类中我遇到了很多错误; IDE无法识别’import spark.implicits._或toDF(),因此测试不会运行. 我正在使用SparkSession,它自动创建SparkConf,SparkContext和SQLContext. 我的代码只使用Spark repo中的示例代码. 任何想法为什么这不起作用?谢谢! NB.我已经看过StackOverflow上的Spark单元测试问题,就像这个:How to write unit tests in Spark 2.0+? 我正在使用Scala 2.11.8和Spark 2.2.0与SBT和IntelliJ.这些依赖项正确包含在SBT构建文件中.运行测试时的错误是: 错误:(29,10)值toDF不是org.apache.spark.rdd.RDD [dataLoadTest.this.Person]的成员 错误:(20,20)需要稳定的标识符,但找到了dataLoadTest.this.spark.implicits. IntelliJ将无法识别导入spark.implicits._或.toDF()方法. 我已导入: 解决方法
你需要将sqlContext分配给val以使implicits工作.由于你的sparkSession是一个var,因此implicits不适用
所以你需要这样做 val sQLContext = spark.sqlContext import sQLContext.implicits._ 此外,您可以为测试编写函数,以便您的测试类看起来如下所示 class dataLoadTest extends FunSuite with Matchers with BeforeAndAfterEach { private val master = "local[*]" private val appName = "data_load_testing" var spark: SparkSession = _ override def beforeEach() { spark = new SparkSession.Builder().appName(appName).master(master).getOrCreate() } test("Creating dataframe should produce data from of correct size") { val sQLContext = spark.sqlContext import sQLContext.implicits._ val df = spark.sparkContext .textFile("/Applications/spark-2.2.0-bin-hadoop2.7/examples/src/main/resources/people.txt") .map(_.split(",")) .map(attributes => Person(attributes(0),attributes(1).trim.toInt)) .toDF() assert(df.count() == 3) assert(df.take(1)(0)(0).equals("Michael")) } override def afterEach() { spark.stop() } } case class Person(name: String,age: Int) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |