Flink 入门实战之七Source自定义读取Mongodb数据

  • flink自定义SourceRichFunction读取mongodb数据
package com.day
import com.mongodb.BasicDBObject
import com.mongodb.casbah.Imports.{MongoClient, MongoClientURI, MongoDBObject}
import org.apache.flink.configuration.Configuration
import org.apache.flink.streaming.api.functions.source.{RichSourceFunction, SourceFunction}
import org.apache.flink.streaming.api.scala._
object SourceMongodb {
  case class User (uid: Int, name: String, age: Int, sex:String)

  def main(args: Array[String]): Unit = {
    // 1、获取流式环境变量
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    // 2、添加自定义source  连接mongodb
    val dataStream = env.addSource(new MongodbSource)
    // 3、打印数据
    dataStream.print()
    // 4、执行任务
    env.execute("mysql Job")
  }

  //自定义source连接mongodb
  class MongodbSource extends RichSourceFunction[User] {
    val uri = "mongodb://root:root@jeff200:27017/"
    var mongoClient:MongoClient = _
    override def open(parameters: Configuration): Unit = {
      mongoClient = MongoClient(MongoClientURI(uri))
    }

    override def run(ctx: SourceFunction.SourceContext[User]): Unit = {
      val uid = 0
      val coll = mongoClient(s"db_user")(s"UserInfo")
      // 匹配name包含‘小’,且uid不为0的数据
      val query = new BasicDBObject("name", new BasicDBObject("$regex", "(.*"+"小"+".*)"))
        .append("uid", new BasicDBObject("$ne", uid))
      val obj = coll.find(query)
      if(obj.nonEmpty){
        val info = obj.next()
        ctx.collect(
          User(
            uid = info.get("uid").toString.toInt,
            name = info.get("name").toString,
            age = info.get("age").toString.toInt,
            sex = info.get("sex").toString
          )
        )
      }
    }

    override def cancel(): Unit = {
      if (mongoClient != null) mongoClient.close
    }
  }
}

  • 核心依赖
 <!-- mongo连接器 -->
<dependency>
   <groupId>org.mongodb</groupId>
   <artifactId>casbah-core_2.11</artifactId>
   <version>3.1.1</version>
   <scope>${scope}</scope>
</dependency>
  • 数据
    在这里插入图片描述
    在这里插入图片描述
  • 注意
    由于使用第三方casbah连接器,发布到生产环境时候要将casbah-core_2.11.jar引入flink/lib下面
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值