FlinkSql读取本地文件系统的csv和json文件的方法(scala)

我的Flink版本为1.13.6

 <flink.version>1.13.6</flink.version>

FlinkSql读取本地文件系统的csv和json文件需要以下两个依赖

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-csv</artifactId>
    <version>${flink.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-json</artifactId>
    <version>${flink.version}</version>
</dependency>

然后我们在工程中建立一个示例文件data.csv,内容如下:

1,Inori,100
2,Kazumi,80
3,Sakura,70
4,Maki,60
5,Rin,50
6,Kyouko,40
7,Mio,30
8,Yukari,20
9,Aya,10

随后建立一个scala类 CSVFileSystem 

import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.table.api.EnvironmentSettings
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment

object CSVFileSystem {
  def main(args: Array[String]): Unit = {
    val settings = EnvironmentSettings.newInstance()
      .inStreamingMode()
      .build()
    val see: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    val tabEnv: StreamTableEnvironment = StreamTableEnvironment.create(see)

    tabEnv.executeSql(
      """
         |CREATE TABLE person(
         |id INT,
         |name STRING,
         |age INT
         |) WITH (
         |'connector' = 'filesystem',
         |'path' = 'file:///F:\Third\flinksql\data\data.csv',
         |'format' = 'csv',
         |'csv.field-delimiter' = ',',
         |'csv.ignore-parse-errors' = 'true'
         |)
         |""".stripMargin)

    tabEnv.sqlQuery("SELECT * FROM person").execute().print()
  }
}

其中一些参数解释如下:

'connector' = 'filesystem'

指定表的连接器类型为filesystem。这意味着这个表将与本地文件系统交互,用于读写数据。

'path' = 'file:///F:\Third\flinksql\data\data.csv'

指定文件的本地路径

'format' = 'csv'

指定了文件的格式为CSV(逗号分隔值)。这意味着表中的数据将以CSV格式存储或读取。

'csv.field-delimiter' = ','

指定了CSV文件中字段的分隔符为逗号(,

'csv.ignore-parse-errors' = 'true'

指定在解析CSV文件时,如果遇到解析错误,应该忽略这些错误而不是抛出异常。

最终的结果如下:

可以发现FlinkSQL建立的表自动多出了一列op,op是操作(operate)的意思+I代表这行数据是insert进入的。

再建立一个json数据文件data.log,注意不能是json格式的文件,因为这样的话会默认一个文件仅代表一个json对象而出现解析异常:

{"id":1,"name":"henry1","age":22,"gender":"男"}
{"id":2,"name":"henry2","age":18,"gender":"女"}
{"id":3,"name":"henry3","age":27,"gender":"男"}
{"id":4,"name":"henry4","age":19,"gender":"男"}
{"id":5,"name":"henry5","age":25,"gender":"女"}
{"id":6,"name":"henry6","age":21,"gender":"男"}
{"id":7,"name":"henry7","age":23,"gender":"女"}
{"id":8,"name":"henry8","age":20,"gender":"男"}
{"id":9,"name":"henry9","age":24,"gender":"女"}
{"id":10,"name":"henry10","age":26,"gender":"男"}

建立一个scala类JSONFileSystem,内容如下

import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.table.api.EnvironmentSettings
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment

object JSONFileSystem {
  def main(args: Array[String]): Unit = {
    val settings = EnvironmentSettings.newInstance()
      .inStreamingMode()
      .build()
    val see: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    val tabEnv: StreamTableEnvironment = StreamTableEnvironment.create(see)

    tabEnv.executeSql(
      """
         |CREATE TABLE person(
         |id INT,
         |name STRING,
         |age INT,
         |gender STRING
         |) WITH (
         |'connector' = 'filesystem',
         |'path' = 'file:///F:\Third\flinksql\data\data.log',
         |'format' = 'json',
         |'json.ignore-parse-errors' = 'true'
         |)
         |"""
        .stripMargin)

    tabEnv.sqlQuery("SELECT * FROM person").execute().print()

  }
}

json解析无需指定分隔符,其余配置项与csv基本一致

可以看到最终结果如下:

Flink是一个开源的流处理框架,用于处理大规模的数据流。从Flink 1.12版本开始,Table APISQL成为Flink的核心API之一,提供了一种声明式编程接口。在Flink 1.17版本中,可以使用Table API或SQL读取CSV文件。 以下是使用Flink Table API读取CSV文件的基本步骤: 1. 首先,需要将CSV文件作为数据源加入到Flink环境中。使用`readTextFile`方法可以读取文本文件,但这不是处理CSV的最佳方式,因为CSV文件可能包含复杂的分隔符引号等。 2. 更好的选择是使用`read_csv`方法。这要求首先定义一个CSV格式的schema,以便Flink能够正确解析CSV文件中的数据。这个schema定义了CSV中各列的数据类型。 3. 使用`fromPath`或者`fromUri`方法来指定CSV文件的路径,然后通过`read`方法读取数据。 以下是一个简单的代码示例: ```java import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.table.api.bridge.java.BatchTableEnvironment; import org.apache.flink.table.api.Table; import org.apache.flink.table.descriptors.Csv; import org.apache.flink.table.descriptors.Schema; import org.apache.flink.types.Row; public class FlinkReadCSVExample { public static void main(String[] args) throws Exception { // 创建一个执行环境 ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); BatchTableEnvironment tableEnv = BatchTableEnvironment.create(env); // 定义输入的schema,指定各个字段的名称类型 Schema schema = new Schema() .field("id", Types.INT()) .field("name", Types.STRING()) .field("age", Types.INT()); // 注册表,并指定数据源路径schema tableEnv.connect(new Csv().path("path/to/csvfile.csv")) .withFormat(schema) .withSchema(schema) .createTemporaryTable("csvInput"); // 执行SQL查询 Table result = tableEnv.sqlQuery("SELECT id, name, age FROM csvInput"); // 将Table转换为DataSet DataSet<Row> resultDataSet = tableEnv.toDataSet(result, Row.class); // 执行Flink程序 resultDataSet.print(); } } ``` 注意:上述代码是Flink 1.17版本之前的写法,新版本可能有所不同,具体请参考Flink官方文档版本更新说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值