下面的简单代码读取JSON string
,并创建一个数据集,当MyClass
是case 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 ***********