SparkCoreSqlStreaming联合使用案例

需求:

实时统计所有商品销售量的top3(不同厂商同一商品)

测试数据:

001 mi moblie
002 mi moblie
003 mi moblie
004 mi moblie
005 huawei moblie
006 huawei moblie
007 huawei moblie
008 Oppo moblie
009 Oppo moblie
010 uniqlo colthing
011 uniqlo colthing
012 uniqlo colthing
013 uniqlo colthing
014 uniqlo colthing
015 selected colthing
016 selected colthing
017 selected colthing
018 Armani colthing
019 lining sports
020 nike sports
021 adidas sports
022 nike sports
023 anta sports
024 lining sports
025 lining sports

测试代码

模拟数据产生(把上述数据发送到mini1(虚拟机名)8888端口)

streaming得到数据→处理数据→foreachRDD→rdd转为DataFrame→DataFrame创建虚拟表→sql查询→打印输出

package spark.SparkStreaming
import org.apache.spark.sql.SparkSession
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
  * 不同厂商,同一商品top3
  */
object UnionSpark {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("top3")
      .master("local[2]").getOrCreate()
    val sc = spark.sparkContext
    val ssc = new StreamingContext(sc,Seconds(3))
    ssc.checkpoint("file:///C:\\Users\\luoyunfan\\Desktop\\spark")
    //从虚拟机mini1的6666端口读入数据(上述测试数据)
    val data = ssc.socketTextStream("mini1",6666)
    //对数据进行逻辑处理
    val res = data.filter(_.nonEmpty)
      .map(x=>{
        val arr = x.split("\\s+")
        val brand = arr(1).trim
        val goods = arr(2).trim
        ((brand,goods),1)
      })
      .updateStateByKey((now:Seq[Int],his:Option[Int])=>{
        Some(now.sum+his.getOrElse(0))
      })
      .foreachRDD(rdd=>{
        //sparkcore
        //rdd中数据形式
        //    ((huawei,moblie),3)
        //    ((adidas,sports),1)

        import spark.implicits._
        rdd.map(perEle=>{
          (perEle._1._1,perEle._1._2,perEle._2)
        })
        .toDF("brand","goods","cnt")
        .createOrReplaceTempView("tb_goods")

        //spark sql
        spark.sql(
          """
            |select
            |brand `厂商`,
            |goods `商品名`,
            |cnt `下单量`,
            |row_number()over(distribute by goods sort by cnt desc) level
            |from tb_goods
            |having level<=3
          """.stripMargin).show()
      })
    ssc.start()
    ssc.awaitTermination()
  }
}

在结果实时落地到db中的时候要注意以下几点:

表中只保留不同厂商同类型商品的top3。
有三种方案:
      方案1:每次落地到表中,将top3之外的delete。这种方式是最优的。但是它,没有历史数据的存储。
      方案2:表中保留历史和最新的top3,共存。弊端:和需求不吻合
      方案3:每次落地到db之前,清空表数据。弊端:体验度不好,某一时刻数据库没有数据,会出现前端空白现象。

  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值