Flink1.14.3 Table API读取HDFS

1 需求

需求:Flink Table API从HDFS分布式文件系统读取JSON⽂件。

2 添加Maven依赖

Flink使⽤JSON和HDFS引⼊如下依赖:

#引入json格式依赖

<dependency>

 <groupId>org.apache.flink</groupId>

 <artifactId>flink-json</artifactId>

 <version>${flink.version}</version>

</dependency>

#引入日志依赖,进行代码调试

<dependency>

  <groupId>org.slf4j</groupId>

  <artifactId>slf4j-simple</artifactId>

  <version>1.7.15</version>

</dependency>

#引入flink与hadoop兼容性依赖

<dependency>

  <groupId>org.apache.flink</groupId>

  <artifactId>flink-hadoop-compatibility_2.11</artifactId>

  <version>${flink.version}</version>

</dependency>

#引入Hadoop依赖

<dependency>

  <groupId>org.apache.hadoop</groupId>

  <artifactId>hadoop-client</artifactId>

  <version>${hadoop.version}</version>

#排查冲突jar包

  <exclusions>

<exclusion>

  <groupId>org.apache.commons</groupId>

  <artifactId>commons-math3</artifactId>

</exclusion>

<exclusion>

  <groupId>org.apache.commons</groupId>

  <artifactId>commons-compress</artifactId>

</exclusion>

  </exclusions>

</dependency>

3 代码实现

package com.bigdata.chap02;

import org.apache.flink.table.api.*;

import static org.apache.flink.table.api.Expressions.$;

/**

*@author-yangjun

*@contact-wei xin:john_1125

*/

public class FlinkTableAPIFromHDFS {

public static void main(String[] args) {

//1、创建TableEnvironment

EnvironmentSettings settings = EnvironmentSettings

.newInstance()

.build();

TableEnvironment tEnv = TableEnvironment.create(settings);

//2、创建source table

final Schema schema = Schema.newBuilder()

.column("user", DataTypes.STRING())

.column("url", DataTypes.STRING())

.column("cTime", DataTypes.STRING())

.build();

tEnv.createTemporaryTable("sourceTable", TableDescriptor.forConnector("filesystem")

.schema(schema)

.format("json")

.option("path","hdfs://mycluster/data/clicklog/input/click.log")

.build());

//3、创建sink table

tEnv.createTemporaryTable("sinkTable", TableDescriptor.forConnector("print")

.schema(schema)

.build());

//5、输出(包括执行,不需要单独在调用tEnv.execute("job"))

tEnv.from("sourceTable")

.select($("user"), $("url"),$("cTime"))

.executeInsert("sinkTable");

}

}

4 配置Hadoop环境变量

在Windows本地配置Hadoop环境变量,同时Windows下的Hadoop安装目录中需要包含HDFS集群配置文件hdfs-site.xml和core-site.xml。否则代码无法识别路径hdfs://mycluster。

5 添加log4j文件

在项目的src/main/目录下,创建resources目录并标记为Mark Directory as—>Resources Root,然后将log4j.properties文件拷贝到resources目录中,log4j.properties具体内容如下所示。

log4j.rootLogger=error,CONSOLE,info

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender     

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout     

log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n    

log4j.logger.info=info

log4j.appender.info=org.apache.log4j.DailyRollingFileAppender

log4j.appender.info.layout=org.apache.log4j.PatternLayout     

log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  

log4j.appender.info.datePattern='.'yyyy-MM-dd

log4j.appender.info.Threshold = info   

log4j.appender.info.append=true

log4j.appender.info.File=G:/tmp/log/info.log

log4j.logger.error=error  

log4j.appender.error=org.apache.log4j.DailyRollingFileAppender

log4j.appender.error.layout=org.apache.log4j.PatternLayout     

log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  

log4j.appender.error.datePattern='.'yyyy-MM-dd

log4j.appender.error.Threshold = error   

log4j.appender.error.append=true

log4j.appender.error.File=G:/tmp/log/error.log

log4j.logger.DEBUG=DEBUG

log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender

log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout     

log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  

log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd

log4j.appender.DEBUG.Threshold = DEBUG   

log4j.appender.DEBUG.append=true

log4j.appender.DEBUG.File=G:/tmp/log/dubug.log

6 准备数据集

准备测试数据集click.log:

{"user":"Mary","url":"./home","cTime":"2022-02-02 12:00:00"}

{"user":"Mary","url":"./prod?id=1","cTime":"2022-02-02 12:00:05"}

{"user":"Liz","url":"./home","cTime":"2022-02-02 12:01:00"}

{"user":"Bob","cTime":"2022-02-02 12:01:30"}

{"user":"Mary","url":"./prod?id=7","cTime":"2022-02-02 12:01:45"}

创建hdfs目录

bin/hdfs dfs -mkdir -p /data/clicklog/input

将click.log文件上传至/data/clicklog/input目录

bin/hdfs dfs -put click.log /data/clicklog/input

7 测试运行

在idea工具中,右键项目选择Run运行Flink Table,如果能在控制台看到打印如下结果,说明Flink Table API能成功读取HDFS中的JSON格式数据。

4> +I[Mary, ./home, 2022-02-02 12:00:00]

4> +I[Mary, ./prod?id=1, 2022-02-02 12:00:05]

4> +I[Liz, ./home, 2022-02-02 12:01:00]

4> +I[Bob, null, 2022-02-02 12:01:30]

4> +I[Mary, ./prod?id=7, 2022-02-02 12:01:45]

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个基于Flink1.14.3 Table SQL API的MySQL列加工数据处理JAVA代码的示例: ```java import org.apache.flink.api.common.typeinfo.TypeInformation; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.typeutils.RowTypeInfo; import org.apache.flink.connector.jdbc.JdbcInputFormat; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.EnvironmentSettings; import org.apache.flink.table.api.Table; import org.apache.flink.table.api.TableEnvironment; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; import org.apache.flink.types.Row; public class MySQLColumnProcessing { public static void main(String[] args) throws Exception { // 创建执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build()); // 定义MySQL连接信息 String url = "jdbc:mysql://localhost:3306/test"; String username = "root"; String password = "root"; String driverName = "com.mysql.jdbc.Driver"; // 定义MySQL输入格式 JdbcInputFormat jdbcInputFormat = JdbcInputFormat.buildJdbcInputFormat() .setDrivername(driverName) .setDBUrl(url) .setUsername(username) .setPassword(password) .setQuery("SELECT * FROM user") .setRowTypeInfo(new RowTypeInfo(TypeInformation.of(Integer.class), TypeInformation.of(String.class), TypeInformation.of(Integer.class))) .finish(); // 创建一个表,并将MySQL数据源注册为表 Table table = tEnv.fromDataStream(env.createInput(jdbcInputFormat), "id, name, age"); tEnv.registerTable("user", table); // 使用SQL API进行列加工处理 Table result = tEnv.sqlQuery("SELECT id, CONCAT('My name is ', name) as name, age+1 as age FROM user"); // 打印结果 tEnv.toRetractStream(result, Row.class).print(); // 执行任务 env.execute("MySQL Column Processing"); } } ``` 这个示例代码读取MySQL数据库中的`user`表数据,对`name`列进行字符串拼接,并对`age`列进行加1操作,最后将结果打印出来。您需要将MySQL连接信息替换为自己的连接信息,并根据具体的业务需求修改SQL查询语句。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据研习社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值