Flink DataSet 常用几种读取文件方式--Scala

1、环境

   jdk 1.8.0_108

   Scala 2.11.8

   Flink 1.7.2

   MySql 8.0.13

2、Maven依赖

<dependency>
     <groupId>org.apache.flink</groupId>
     <artifactId>flink-scala_2.11</artifactId>
     <version>1.7.2</version>
    </dependency>
 
<dependency>
     <groupId>org.apache.flink</groupId>
     <artifactId>flink-jdbc_2.12</artifactId>
     <version>1.7.2</version>
</dependency>
 
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>

3、代码示例
 

package com.test.flink

import org.apache.flink.api.common.typeinfo.BasicTypeInfo
import org.apache.flink.api.java.io.jdbc.JDBCInputFormat
import org.apache.flink.api.java.typeutils.RowTypeInfo
// 导入scala的隐式转换
import org.apache.flink.api.scala.{ExecutionEnvironment, _}
import org.apache.flink.configuration.Configuration

/**
  * Created On Date: 2019/11/21 0021 13:08
  * Flink 文件读取及DataSet常用方式
  */
object FlinkReadFileTest {

  def main(args: Array[String]): Unit = {

    val env = ExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)

    //用于递归读取文件配置参数,默认是False
    val parameters = new Configuration
    parameters.setBoolean("recursive.file.enumeration", true)

    // 从本地读取文件
    val localLines = env.readTextFile("file:///path/to/my/textfile")

    // 从hdfs读取文件,需要写上hdfs的nameService(高可用集群),或者namenode ip及端口号
    val hdfsLines = env.readTextFile("hdfs://nnHost:nnPort/path/to/my/textfile")


    // 从CSV中读取文件,可以指定读取数据范围
    val csvInput2 = env.readCsvFile[(String, Double)](
      "hdfs:///the/CSV/file",
      includedFields = Array(0, 3)) // 读下标为0,4字段

    // 读取CSV可以用样例类作为泛型
    case class MyCaseClass(str: String, dbl: Double)
    val csvInput3 = env.readCsvFile[MyCaseClass](
      "hdfs:///the/CSV/file",
      includedFields = Array(0, 3)) // 读下标为0,4字段

  
    // 读取CSV同样可以使用POJO作为泛型
    val csvInput = env.readCsvFile[Person](
      "hdfs:///the/CSV/file", pojoFields = Array("name", "age", "zipcode"))


     // 从CSV中递归读取文件
    val csvInput1 = env.readCsvFile[(String, String, String)]("d://tmp/t/")
     // 使用递归方式读取数据
      .withParameters(parameters).print()

/**   
      *  读取CSV还有以下常用参数,便于我们灵活配置

      * fieldDelimiter: String指定分隔记录字段的定界符。默认的字段分隔符是逗号','
      * lenient: Boolean启用宽大的解析,即忽略无法正确解析的行。默认情况下,宽松的分析是禁用的,无效行会引发异常。
      * includeFields: Array[Int]定义要从输入文件读取的字段(以及忽略的字段)。
      *                 默认情况下,将解析前n个字段(由types()调用中的类型数定义) Array(0, 3)
      * lineDelimiter: String指定单个记录的分隔符。默认的行定界符是换行符'\n'
      * pojoFields: Array[String]指定映射到CSV字段的POJO的字段。
      *              CSV字段的解析器会根据POJO字段的类型和顺序自动初始化。 pojoFields = Array("name", "age", "zipcode")
      * parseQuotedStrings: Character启用带引号的字符串解析。如果字符串字段的第一个字符是引号字符(不修剪前导或尾部空格)
      *                      ,则将字符串解析为带引号的字符串。带引号的字符串中的字段定界符将被忽略。
      *                      如果带引号的字符串字段的最后一个字符不是引号字符,则带引号的字符串解析将失败。
      *                      如果启用了带引号的字符串解析,并且该字段的第一个字符不是带引号的字符串,则该字符串将解析为未带引号的字符串。
      *                      默认情况下,带引号的字符串分析是禁用的。
      * ignoreComments: String指定注释前缀。以指定的注释前缀开头的所有行都不会被解析和忽略。默认情况下,不忽略任何行。
      * ignoreFirstLine: Boolean将InputFormat配置为忽略输入文件的第一行。默认情况下,不忽略任何行。

*/


    // 使用元素创建DataSet
    val values = env.fromElements("Foo", "bar", "foobar", "fubar")

    // 生成一个数据序列作为DataSet
    val numbers = env.generateSequence(1, 10000000)

    // 使用JDBC输入格式从关系数据库读取数据
    val inputMysql = env.createInput(JDBCInputFormat.buildJDBCInputFormat()
      // 数据库连接驱动名称
      .setDrivername("com.mysql.jdbc.driver")
      // 数据库连接驱动名称
      .setDBUrl("jdbc:mysql://")
      // 数据库连接用户名
      .setUsername("root")
      // 数据库连接密码
      .setPassword("password")
      // 数据库连接查询SQL
      .setQuery("select name,age,class from test")
      // 字段类型,顺序个个数必须与SQL保持一致
      .setRowTypeInfo(new RowTypeInfo(BasicTypeInfo.STRING_TYPE_INFO, 
          BasicTypeInfo.INT_TYPE_INFO, BasicTypeInfo.STRING_TYPE_INFO))
      .finish()
    )


  }

}

4、压缩文件

        如果输入文件标记有适当的文件扩展名,Flink当前支持透明的输入文件解压缩。特别是,这意味着无需进一步配置输入格式,并且不需要任何FileInputFormat压缩支持,包括自定义输入格式。请注意,压缩文件可能无法并行读取,从而影响作业的可伸缩性。

下表列出了当前支持的压缩方法:

Compression methodFile extensionsParallelizable
DEFLATE.deflateno
GZip.gz.gzipno
Bzip2.bz2no
XZ.xzno

 

      个人学习笔记,示例比较简单,如有问题,欢迎讨论~

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: flink-1.14.3-bin-scala_2.12 是Apache Flink的一个版本,它是一个基于分布式数据流处理的开源平台。Flink提供了高效的流处理和批处理能力,支持各种数据源和格式,具有高可用性、可伸缩性、易于使用和开发的特点。 其中,1.14.3代表这个版本是Apache Flink的第1.14.3个稳定版本,其中包含了性能优化、改进和新功能。Scala_2.12表示在这个版本中使用了Scala编程语言的2.12版本,这意味着这个版本支持Scala编程。 在flink-1.14.3-bin-scala_2.12中,最重要的新功能之一是针对Apache Kafka的完整支持。此外,还支持更优秀的可伸缩性,提供了更多的API变更和改进等。它还提供了一些改进,例如在任务重启时恢复状态,提高了批处理的性能和吞吐量。 总之,flink-1.14.3-bin-scala_2.12是一个高效、可伸缩、易于使用和开发的分布式数据流处理平台,支持流处理和批处理,被广泛用于企业级数据处理和实时数据分析。 ### 回答2: Flink-1.14.3-bin-scala_2.12是一个 Apache Flink 的软件发行版,主要针对 Scala 2.12 版本进行构建。Apache Flink是一个分布式流处理引擎,支持批量和流式数据处理和分析,并提供高可用性、可扩展性和容错性等特性。Flink-1.14.3-bin-scala_2.12是Apache Flink最新的稳定版本,其中包含了许多新的特性、改进和修复了一些前版本中存在的问题。在Flink-1.14.3-bin-scala_2.12中,采用了新的caching机制来提高性能,支持Kinesis Video Streams、Kudu、Flink SQL等新的特性,同时也优化了Flink Web Dashboard和Flink SQL Client的用户体验。Flink-1.14.3-bin-scala_2.12的使用需要一定的编程经验,可以使用Java、Scala或Python进行开发。此版本对于需要处理大规模数据的企业或个人提供了有力的支持,可以提高数据处理效率和准确性,同时也降低了使用成本和复杂度。 ### 回答3: Flink是一个大数据处理框架,其最新版本是flink-1.14.3。该版本支持Scala 2.12编程语言,并附带可执行二进制文件文件名为“flink-1.14.3-bin-scala_2.12”。 该文件中包含了Flink代码和相关依赖库,用户可以直接下载该文件并解压缩后即可开始使用Flink框架进行大数据处理。用户只需要将自己的程序代码打包成JAR文件,并提交给Flink集群运行,Flink就会自动管理和调度任务,实现高效的分布式计算。 该版本中包含了许多新的功能和改进,例如增强的流式数据处理能力、更简洁的API、更快的数据处理速度等。此外,该版本还修复了许多已知的问题和Bug,提高了Flink的稳定性和性能表现。 总之,flink-1.14.3-bin-scala_2.12是Flink框架的最新版本,其包含了许多有用的功能和改进,用户可以下载并使用该版本来进行高效的大数据处理
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值