数据清洗(一)flink算子从socket读取json文本并进行数据处理

摘要:在国家实施大数据战略加快建设数字中国的伟大时代背景下,随着各种新型大数据技术的快速发展,flink在企业批流一体化大数据平台建设过程中,逐步稳固了江湖地位。本文将用flink转换算子演示对一个json文本进行数据清洗。

科学技术是第一生产力,值此“新基建”建设如火如荼时,大数据进入信息化发展的新阶段,各地正在大力推进大数据产品创新发展,数字成为数字经济中的关键要素,时代正经历百年未有之大变局,疫情这个黑天鹅还在四处挥舞,数据治理提升到了国家高度,未来十年国家将以数据治国,企业将以数据经营,个人将以数据谋生。2003年到2006年,谷歌陆续发表了奠定大数据理论基础的三篇论文:《Google File System》、《Google MapReduce》、《Google Bigtable》,自此,大数据技术如星星之火,燎原全球。MapReduce,Storm,Spark,Flink,Blink各种计算引擎如雨后春笋,遍地开花。无论技术怎么变,获取数据,清洗数据,分析数据,应用数据的发展主线不会变。本文将以flink计算引擎的map算子清洗json文本,以求管中窥豹,一睹flink的风采。

准备材料:

1、json样例

说明:json文本采用压缩格式,可以使用工具:https://www.bejson.com/

{"searchTime":1553650604,"code":200,"results":{"id":"449","items":[{"id":"47","name":"name47","cllx":"NTC","url":"1.jpeg","csys":"red","score":96.03},{"id":"48","name":"name48","cllx":"YGC","url":"2.jpeg","csys":"black","score":97.03},{"id":"49","name":"name49","cllx":"PC","url":"3.jpeg","csys":"blue","score":99.03}]}}

2、网络工具中的瑞士尖刀nc

下载链接:https://eternallybored.org/misc/netcat/

3、Java工程师的宝刀idea

下载链接:https://www.jetbrains.com/

4、maven火炮集群

flink最新版本为1.12.1,此处使用1.7.2

<dependencies>
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-java</artifactId>
      <version>1.7.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-streaming-java_2.11</artifactId>
      <version>1.7.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-clients_2.11</artifactId>
      <version>1.7.2</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.59</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>com.me.flink.SocketWindowJsonConvert</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

知识点原理:

一、flink作业运行环境:StreamExecutionEnvironment

使用抽象工厂模式实现,子类有LocalStreamEnvironment,StreamContextEnvironment,RemoteStreamEnvironment,StreamPlanEnvironment,本文使用LocalStreamEnvironment。作业缺省名称为Flink Streaming Job,默认使用StateBackend持久化checkpoint状态,默认checkpoint时间间隔为500毫秒,默认超时时间为60秒,缺省消息处理语义为EXACTLY_ONCE。

类图结构:

本次使用关键接口:

getExecutionEnvironment,获取运行环境。

socketTextStream,从socket源读取文本送到map算子

setParallelism,设置并行度,默认为任务所在机器的CPU数。

execute,提交到集群或本地执行作业。

二、flink算子,map,将一个对象转换为另外一个对象,属于1-1映射。使用的场景有数据值转换,数据key转换,聚合等。

MapFunction类图结构

实现关键接口:map。

调试步骤:

1、运行nc

2、shift+F9启动调试

首先使用StreamExecutionEnvironment获取flink运行环境,从socketTextStream读取nc输入流,IP为本地IP,端口为9000,。使用CarEntity获取json转换结果,方便编码清洗。

将上面示例json文本串贴入nc,回车

json文本转实体

red值清洗为1

打印清洗后的值

关键源码:

SocketWindowJsonConvert类

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStream<String> text = env.socketTextStream("localhost", 9000, "\n");
        SingleOutputStreamOperator<CarEntity> StreamRecord = text
                .map(new MapFunction<String, CarEntity>() {
                    public CarEntity map(String s) throws Exception {
                        CarEntity entity = JSON.parseObject(s).toJavaObject(CarEntity.class);
                        return entity;
                    }
                })
                .setParallelism(1);
        DataStream<JSONObject> jsonObjectDataStream = StreamRecord.map(new MapFunction<CarEntity, JSONObject>() {
            public JSONObject map(CarEntity carEntity) throws Exception {
                CarEntity.Results rs = carEntity.getResults();
                List<CarEntity.Results.Items> items = rs.getItems();
                items.forEach(v ->{
                    if (v.getCsys().equals("red")){
                        v.setCsys("1");
                    }
                    if (v.getScore() < 60){
                        v.setScore(60f);
                    }
                });
                return (JSONObject) JSON.toJSON(rs);
            }
        });
        jsonObjectDataStream.print().setParallelism(1);
        try {
            env.execute("json convert");
        } catch (Exception e) {
            e.printStackTrace();
        }

匿名类可以使用拉姆达表达式优化,不过不优化呢阅读性比较友好,仁者见仁智者见智。

CarEntity类

public class CarEntity {
    private int code;
    private String searchTime;
    private Results results;
    public static class Results{
        private int id;
        private List<Items> items;
        public static class Items{
            private int id;
            private String name;
            private String cllx;
            private String url;
            private String csys;
            private Float score;
        }
    }
}

收工。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
很高兴回答你的问题。这属于技术问题,因此我可以为您提供有关如何使用Java语言自定义flink算子从postgresql数据读取数据的信息。 首先,您需要使用JDBC驱动程序连接到postgresql数据库。您可以使用以下代码创建数据库连接: ``` Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(url, user, password); ``` 请注意,您需要替换"url","user","password"与您的postgresql数据库连接信息。 接下来,您需要使用flink的SourceFunction接口实现您的自定义源算子。您可以使用以下代码作为起点: ``` public class PostgresqlSource implements SourceFunction<Row> { private Connection connection; private PreparedStatement statement; public void open(Configuration config) throws Exception { // create database connection Class.forName("org.postgresql.Driver"); connection = DriverManager.getConnection(url, user, password); // prepare statement to fetch data statement = connection.prepareStatement("SELECT ... FROM ..."); } public void run(SourceContext<Row> ctx) throws Exception { ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { // create Row object from result set and emit it Row row = new Row(...); ctx.collect(row); } } public void cancel() { // close database connection try { connection.close(); } catch (SQLException e) { } } } ``` 请注意,您需要替换"SELECT ... FROM ..."与您要查询的postgresql数据库表格和字段。您还需要替换"..."与您要发射的Row对象的字段。 最后,在您的flink应用程序中,您可以使用您的自定义源算子作为数据源: ``` DataStream<Row> stream = env.addSource(new PostgresqlSource()); ``` 希望这些信息能够帮助您使用Java语言自定义flink算子从postgresql数据读取数据。如果您有任何其他问题,请随时问我。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zxhyxwwu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值