Flink获取数据源的四种方式 (scala)

1.从集合中读取数据源

使用 fromCollection() 方法将数据放入Seq序列中作为Flink的数据源

object Collections {
  def main(args: Array[String]): Unit = {
    //声明 flink 的运行环境
    var env = StreamExecutionEnvironment.getExecutionEnvironment

    var ds = env.fromCollection(Seq(
      (1,"zhangsan","male","20"),
      (2,"lisi","female","30")
    ))
    ds.print()
    env.execute()
  }
}

也可以使用样例类将数据封装成对象序列传入 fromCollection() 方法作为Flink的数据源

case class Worker(id:Int,name:String,gender:String,age:Int)
object Collections {
  def main(args: Array[String]): Unit = {
    //声明 flink 的运行环境
    var env = StreamExecutionEnvironment.getExecutionEnvironment
    var ds = env.fromCollection(Seq(
      Worker(1,"张三","男",20),
      Worker(2,"李四","女",21),
      Worker(3,"王五","男",22),
      Worker(4,"赵六","女",23)
    ))
    ds.print()
    env.execute()
  }
}

还可以通过调用 fromElements() 方法将数据直接输入

2.从文件中读取数据

readTextFile()

通过 readTextFile() 方法可以将本地或hdfs上的文件作为数据源读入Flink

3.从 Kafka 中读取数据

在实现 Flink 读取 Kafka 的数据时,需要导入相关依赖

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-shaded-hadoop-2-uber</artifactId>
    <version>2.7.5-9.0</version>
</dependency>

通过 addSource() 方法加载kafka中的数据 

def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment

    //设置kafka的相关配置
    val prop = new Properties()
    prop.setProperty("bootstrap.servers","192.168.100.155:9092")
    prop.setProperty("group.id","user1")

    val ds = env.addSource(new FlinkKafkaConsumer011[String]("flink",new SimpleStringSchema(),prop))
    ds.print()
    env.execute()
  }

可通过调节kafka的游标相关参数,读取已存在kafka队列中的数据

4.自定义数据源

以Flink读取MySQL的数据为例,通过 addSource() 方法,将实现 SourceFunction 的对象作为参数传入。代码如下:

object UDFSource {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment

    val ds = env.addSource(new MysqlSource())
    ds.print()
    env.execute()
  }
}

 实现 SourceFunction 的代码如下:

class MysqlSource extends SourceFunction[Stu] {
  var isFlag = true
  val url = "jdbc:mysql://192.168.100.155:3306/exp"
  val driver = "com.mysql.jdbc.Driver"
  val username = "root"
  val password = "okok"
  Class.forName(driver)

  override def run(sourceContext: SourceFunction.SourceContext[Stu]): Unit = {
    //添加mysql数据库的配置信息
    var conn = DriverManager.getConnection(url,username,password)  //该参数不能作为成员变量,必须写入方法中,否则报错:无法实现序列化
    val ps = conn.prepareStatement("select * from s1_student")
    while (isFlag) {
      val rs = ps.executeQuery()
      while (rs.next()) {
        var no = rs.getString("sno")
        var name = rs.getString("sname")
        var birthday = rs.getString("sbirthday")
        var sex = rs.getString("ssex")
        var sclass = rs.getString("sclass")
        sourceContext.collect(new Stu(no,name,birthday,sex,sclass))
      }
      Thread.sleep(3000)
    }
  }

  override def cancel(): Unit = {
    isFlag = false
  }
}

Stu类:

class Stu (no:String,name:String,birthday:String,sex:String,sclass:String) extends Serializable {
  override def toString = {
    "no:" + no + "\tname:" + name + "\tbirthday:" + birthday + "\tsex:" + sex + "\tsclass:" + sclass
  }
}

打印效果如下:

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink 中使用 Kafka 作为数据源,可以使用 Flink 的 Kafka Connector,具体操作可以参考官方文档:https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/dev/connectors/kafka.html 数据清洗可以在 Flink 中使用 Map 或 FlatMap 函数实现,具体操作也可以参考官方文档:https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/dev/stream/operators/ 以下是一个示例代码,假设 Kafka 中的消息格式为 (key, value),value 为包含多个字段的 JSON 字符串,需要对其中某些字段进行清洗: ```scala import org.apache.flink.streaming.api.scala._ import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer case class Message(key: String, field1: String, field2: String) val env = StreamExecutionEnvironment.getExecutionEnvironment val properties = new Properties() properties.setProperty("bootstrap.servers", "localhost:9092") properties.setProperty("group.id", "flink-kafka-example") val consumer = new FlinkKafkaConsumer[String]("topic", new SimpleStringSchema(), properties) val stream = env.addSource(consumer) val cleanedStream = stream .map(json => { val obj = parse(json).extract[Message] Message(obj.key, cleanField(obj.field1), cleanField(obj.field2)) }) def cleanField(field: String): String = { // 对字段进行清洗,比如去除空格、转换大小写等操作 field.trim.toLowerCase } cleanedStream.print() env.execute("Kafka data cleaning example") ``` 在代码中,首先通过 FlinkKafkaConsumer 从 Kafka 中读取数据,并使用 SimpleStringSchema 将消息转换为字符串。然后使用 Map 函数将 JSON 字符串解析成样例类 Message,同时对其中的 field1 和 field2 字段进行清洗,最后将清洗后的结果打印出来。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值