Apache Spark使用Non-Case类创建数据集

时间:2018-10-05 19:10:34

标签: scala apache-spark apache-spark-sql

下面的简单代码读取JSON string,并创建一个数据集,当MyClasscase class时,它起作用,但是当MyClass是{{1} }它失败了,我相信我们可以使用编码器,但是由于某种原因,这欺骗了我。

设置

non-case class

案例类工作演示

import org.apache.spark.sql.Encoders
import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder
import org.apache.spark.sql.types._

val schema = StructType(List(StructField("KAFKA_ID", StringType, true),StructField("KAFKA_TS", StringType, true)))

非案例的非工作代码。我看到线程溢出了,但是没有任何意义。

// ******* Working code for CASE - Class ***********
case class MyClass( KAFKA_ID: String, KAFKA_TS: String )
val jsonData1 = """{"KAFKA_ID": "1", "KAFKA_TS" : "T1"}"""
val jsonData2 = """{"KAFKA_ID": "2", "KAFKA_TS" : "T2"}"""
val res = spark.sqlContext.read.schema(schema).json(spark.sparkContext.parallelize(Seq(jsonData1, jsonData2))).as[MyClass]
res.show(10, false)
// ******* Working code for CASE - Class ***********

出现如下错误

// ******* Not Working code for NON-CASE - Class ***********

class MyClass{
  var _KAFKA_ID: String
  var _KAFKA_TS: String
  def KAFKA_ID_=(value:String):Unit=_KAFKA_ID = value
  def KAFKA_ID=_KAFKA_ID
  def KAFKA_TS_=(value:String):Unit=_KAFKA_TS = value
  def KAFKA_TS=_KAFKA_TS
} 

implicit val myClassEncoder = org.apache.spark.sql.Encoders.kryo[MyClass]
//val myClassEncoder = Encoders.bean(MyClass)
val jsonData1 = """{"KAFKA_ID": "1", "KAFKA_TS" : "T1"}"""
val jsonData2 = """{"KAFKA_ID": "2", "KAFKA_TS" : "T2"}"""
val res = spark.sqlContext.read.schema(schema).json(spark.sparkContext.parallelize(Seq(jsonData1, jsonData2))).as[MyClass]
res.show(10, false)
// ******* Not Working code for NON-CASE - Class ***********

0 个答案:

没有答案