这个功能主要是实现,SparkSteam实时更新覆盖原表数据,不是追加,由于业务需求,需要不断获取每个用户前N条信息用于数据查询,考虑过直接insert hive表,但是由于hive的jdbc不稳定,容易出现断线、崩溃等问题,所以采用了直接写hdfs的形式。
class SparkRealTimeAnalysisWebService() {
def realTimeDataAlysis(dstream: DStream[String]): Unit = {
val formatData = SparkRealTimeDataEtl().dataFormat(dstream)
formatData.updateStateByKey(etlFunc).flatMap(_._2).map(x=>{
x.get("e")+"|"+x.get("f")+"|"+x
}).foreachRDD(rdd=>{
rdd.saveAsTextFile("/a")
})
}
val etlFunc = (currValues: Seq[java.util.HashMap[String, String]], prevValueState: Option[Seq[java.util.HashMap[String, String]]]) => {
val prevSeq = prevValueState.getOrElse(Seq[java.util.HashMap[String, String]]())
val unionMap = if (prevSeq.isEmpty) currValues else (currValues++:prevSeq).take(100)
Some(unionMap)
}
}