我在Kinesis上有一个Spark流媒体应用程序。事件以这种格式输入:
{
"timestamp": 0,
"operation": "I",
"tableName": "ESQ1.TABLA1",
"numColumns": 4,
"values": ["value1", 5645, 2009, 1.23, 2.23, true, "2009-10-02 16:52:30", "2009-10-02 16:52:30"],
"hash": "hjkfsdh879384394sdkldjf"
}
但值的对象可能会有所不同。根据事件的来源,它可以有更多的字段。
TI需要将这些事件写入Avro文件,为此我查阅元数据表并为每个数据源创建方案...例如:
root
|-- COD_HABIT: string (nullable = true)
|-- COD_TARIFA: integer (nullable = true)
|-- FEC_CREACION: integer (nullable = true)
|-- IND_TIPO: double (nullable = true)
|-- SEQ_RESERVA: double (nullable = true)
|-- USU_CREACION: boolean (nullable = true)
|-- CDR_LOAD_TIMESTAMP: string (nullable = true)
|-- CDR_EXTRACTION_TIMESTAMP: string (nullable = true)
我要做的另一件事是反序列化事件。 问题在于:
object EventStream {
def fromJson(arrayByte: Array[Byte]): EventStream = {
implicit val formats = DefaultFormats
val string = new String(arrayByte, "UTF-8")
println(string)
val parsed = parse(string)
parsed.extract[EventStream]
}
}
case class EventStream(timestamp: String, operation: String, tableName: String, values: List[String], hash: String)
如果我在数据帧出现问题后以字符串形式执行所有操作,因为值的类型与方案不匹配。
sqlContext.createDataFrame(minRDD, minRDDSchema)
.write
.mode(SaveMode.Append)
.avro("s3n://" + config.bucket + "/" + dynamoSchema.entity_key + "/" + dynamoSchema.schema_hash + "/" + timeNowForPath() + "/")
minRDD.first()
[value1, 5645, 2009, 1.23, 2.23, true, 2009-10-02 16:52:30, 2009-10-02 16:52:30]
错误是java.lang.ClassCastException:
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
我无法做某事,因为它通过值列表非常有效并且创建一个asInstanceOf ...
任何想法......?