這讓我感到困惑。我正在使用「spark-testing-base_2.11」%「2.0.0_0.5.0」進行測試。任何人都可以解釋爲什麼如果使用數據集,地圖功能會改變模式,但如果我使用RDD則可以工作嗎?任何見解非常感謝。火星地圖操作更改模式
import com.holdenkarau.spark.testing.SharedSparkContext
import org.apache.spark.sql.{ Encoders, SparkSession }
import org.scalatest.{ FunSpec, Matchers }
class TransformSpec extends FunSpec with Matchers with SharedSparkContext {
describe("data transformation") {
it("the rdd maintains the schema") {
val spark = SparkSession.builder.getOrCreate()
import spark.implicits._
val personEncoder = Encoders.product[TestPerson]
val personDS = Seq(TestPerson("JoeBob", 29)).toDS
personDS.schema shouldEqual personEncoder.schema
val mappedSet = personDS.rdd.map { p: TestPerson => p.copy(age = p.age + 1) }.toDS
personEncoder.schema shouldEqual mappedSet.schema
}
it("datasets choke on explicit schema") {
val spark = SparkSession.builder.getOrCreate()
import spark.implicits._
val personEncoder = Encoders.product[TestPerson]
val personDS = Seq(TestPerson("JoeBob", 29)).toDS
personDS.schema shouldEqual personEncoder.schema
val mappedSet = personDS.map[TestPerson] { p: TestPerson => p.copy(age = p.age + 1) }
personEncoder.schema shouldEqual mappedSet.schema
}
}
}
case class TestPerson(name: String, age: Int)
嗨Tapan。我熟悉地圖的功能。我想要修改一組記錄(查看示例,它需要一個TestPerson,並在其年齡上添加一年)。但是,如果查看返回的TestPerson的模式,它與系統所說的不同(personEncoder)。我不明白的是爲什麼它改變了模式。感謝名單。 – Richard