加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 对于基本数据框创建示例,我应该如何在Spark中编写单元

发布时间:2020-12-16 18:13:27 所属栏目:安全 来源:网络整理
导读:我正在努力编写一个基本单元测试来创建数据框,使用Spark提供的示例文本文件,如下所示. class dataLoadTest extends FunSuite with Matchers with BeforeAndAfterEach {private val master = "local[*]"private val appName = "data_load_testing"private var
我正在努力编写一个基本单元测试来创建数据框,使用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]的成员
可能的原因:在’值toDF’之前可能缺少分号?
????????.toDF()

错误:(20,20)需要稳定的标识符,但找到了dataLoadTest.this.spark.implicits.
??????import spark.implicits._

IntelliJ将无法识别导入spark.implicits._或.toDF()方法.

我已导入:
import org.apache.spark.sql.SparkSession
import org.scalatest.{BeforeAndAfterEach,FlatSpec,FunSuite,Matchers}

解决方法

你需要将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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读