在spark中写入avro文件的类型出错

时间:2016-01-23 19:30:30

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

我在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 ...

任何想法......?

0 个答案:

没有答案