Structured Spark Streaming - explode 多列

package ohmysummer

import ohmysummer.model.SourceCan
import ohmysummer.pipeline.kafka.WmKafkaDeserializer
import ohmysummer.pipeline.schema.{CanSignalSchema, DcSaleData}
import org.apache.spark.sql.{DataFrame, Dataset, SparkSession}
import org.apache.spark.sql.streaming.OutputMode
import org.apache.spark.sql.functions._

/**
  * 从 Kafka 读取  JSON 数据
  *  https://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html
  *  https://stackoverflow.com/questions/43297973/how-to-read-records-in-json-format-from-kafka-using-structured-streaming
  *  https://stackoverflow.com/questions/48361177/spark-structured-streaming-kafka-convert-json-without-schema-infer-schema
  *  https://databricks.com/blog/2017/04/26/processing-data-in-apache-kafka-with-structured-streaming-in-apache-spark-2-2.html
  *  https://databricks.com/blog/2017/02/23/working-complex-data-formats-structured-streaming-apache-spark-2-1.html
  */


object WmDcSaleApplication {
  def main(args: Array[String]) {

    val spark = SparkSession
      .builder
      .appName("ReadFromKafka")
      .master("local[2]")
      .getOrCreate()

    object KafkaDeserializerWrapper {
      val deser = new WmKafkaDeserializer
    }
    spark.udf.register("deserialize", (topic: String, bytes: Array[Byte]) =>
      KafkaDeserializerWrapper.deser.deserialize(topic, bytes)
    )

    val df = spark.readStream
      .format("kafka")
      .option("kafka.bootstrap.servers", "localhost:9092")
      .option("subscribe", "dc-sale-data")
      .option("startingOffsets", "earliest") 
      .load()

    import spark.implicits._
    // 反序列化 value 中的字节数组, 得到原始 JSON
    val result: Dataset[(String, String)] = df.selectExpr("CAST(key AS STRING)", """deserialize("dc-sale-data", value) AS message""")
      .as[(String, String)]

    val schema = (new DcSaleData).schema
    val canSchema = (new CanSignalSchema).schema

    val parsed = result.select($"key", from_json($"message", canSchema) as "data")
//    val event: DataFrame = parsed.select($"data.vin", $"data.version", $"data.tboxSn", $"data.iccid", $"data.createTime", explode(array($"data.event.info"))).select("vin", "version", "tboxSn", "iccid", "createTime", "col.*")
    val event: Dataset[SourceCan] = parsed.select($"data.vin",$"data.version",$"data.tboxSn",$"data.iccid",$"data.createTime",$"data.event.info" as "event",$"data.signal1s.info" as "signal1s", $"data.signal30s.info" as "signal30s")
      .select($"vin", $"version", $"tboxSn", $"iccid", $"createTime",              explode(array($"event")) as "eventcol", $"signal1s", $"signal30s")
      .select($"vin", $"version", $"tboxSn", $"iccid", $"createTime", $"eventcol", explode(array($"signal1s")) as "signal1scol", $"signal30s")
      .select($"vin", $"version", $"tboxSn", $"iccid", $"createTime", $"eventcol", $"signal1scol", explode(array($"signal30s")) as "signal30scol")
      .select($"vin", $"version", $"tboxSn", $"iccid", $"createTime", $"eventcol.*", $"signal1scol.*", $"signal30scol.*")
      .select($"vin", $"createTime", $"HU_TargetSOC" as "targetSoc" , $"ICU_ICUTotalOdometer" as "totalOdometer")
      .filter($"vin".isNotNull)
      .as[SourceCan]

//    parsed.printSchema()
//    event.printSchema()

    val console = event.writeStream
      .format("console")
      .option("truncate", "false")
      .outputMode(OutputMode.Append())

    val query = console.start()

    query.awaitTermination()

  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266