Flink编程练习(二)

这篇博客介绍了如何使用Flink进行Map操作,包括数据准备、程序编写与运行。接着讲解了reduceByKey的实现,讨论了在Flink中处理数据分组的挑战。然后展示了如何执行自然连接操作,处理缺失值的问题。最后,详细阐述了KMeans聚类算法的实现,包括数据准备、程序编写和本地运行的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Map

班级学生成绩的随机生成

  • 输入:本班同学的学号
  • 输出:<学号,成绩>

数据准备

  1. 首先需要一个stuID.csv文件,每一列为一个学号:

    • 53991837251
  2. 然后将文件放入HDFS中:

    hdfs dfs put stuID.csv input
    

编写程序

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.utils.ParameterTool;
import java.util.Random;

public class StuScore {
   
   
    private static Random rand = new Random();

    public StuScore(){
   
   }

    public static void main(String[] args) throws Exception {
   
   
        ParameterTool params = ParameterTool.fromArgs(args);
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        env.getConfig().setGlobalJobParameters(params);
        DataSet<String> text;

        if(params.has("input")){
   
   
            text = env.readTextFile(params.get("input"));
        }else{
   
   
            System.out.println("Please confirm input keywords!");
            return;
        }


        DataSet<Tuple2<String,Integer>> stuscore =  text.map(new MapFunction<String, Tuple2<String, Integer>>() {
   
   
            @Override
            public Tuple2<String, Integer> map(String s) throws Exception {
   
   
                return new Tuple2<>(s,rand.nextInt(100) +1);
            }
        });

        //如果没有指定输出,则默认打印到控制台
        if(params.has("output")){
   
   
            stuscore.writeAsCsv(params.get("output"),"\n", ",");
            env.execute();
        }else{
   
   
            System.out.println("Printing result to stdout. Use --output to specify output path.");
            stuscore.print();
        }

    }
}

注意点

  1. Flink提供了一个ParameterTool用于简化命令行参数的工具
  2. 使用匿名函数新建算子是一种很常见的操作

运行

首先确保已经打开了Flink,并在JAR包下执行

flink run -c StuScore StuScore.jar --input /home/hadoop/Documents/distribution/Flink/StuScore/stuID.csv

这里可以用--output指定输出路径,默认为标准输出

查看结果

54469946644

reduceByKey

问题

求平均成绩:将全班同学每隔5号分为一组,求每组的平均成绩

输入: <学号,成绩>

输出:<组号,平均分>

数据准备

  1. 首先需要一个score.csv文件,每一列为学号和学生成绩:

    • 53991837251

编写程序

import org.apache.commons.compress.archivers.dump.DumpArchiveEntry;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.utils.ParameterTool;

public class AVGscore {
   
   
    private static Integer groupSize = 5;

    public static void main(String[] args) throws Exception {
   
   
        ParameterTool params = ParameterTool.fromArgs(args);
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        env.getConfig().setGlobalJobParameters(params);
        DataSet<Tuple2<Integer, Double>> fileDataSet;

        if (params.has("input")) {
   
   
            fileDataSet = env.readCsvFile(params.get("input"))
                    .types(Integer.class, Double.class);
        } else {
   
   
            System.out.println("Please confirm input keywords!");
            return;
        }

        /**
         * m
### 使用Scala进行Flink练习的资料与教程 #### 一、环境搭建与基础设置 当在Windows环境下操作时,可能会遇到命令执行错误的情况,如`# \r‘: command not found`。这通常是因为文件中的换行符不兼容所引起的。为了修正此问题,可以按照指南调整换行方式[^1]。 对于想要利用Scala开发Flink应用的学习者来说,理解如何配置项目依赖至关重要。通过正确设定Maven项目的POM文件,并采用Scala作为编程语言,能够更好地发挥Apache Flink框架的优势来应对大规模数据集以及实时流处理任务[^3]。 ```xml <dependencies> <!-- Scala dependency --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-scala_2.12</artifactId> <version>${flink.version}</version> </dependency> <!-- Flink Streaming Java dependency (also works with Scala) --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-scala_2.12</artifactId> <version>${flink.version}</version> </dependency> </dependencies> ``` #### 、实践案例分析 一个完整的练习流程可能涉及完善特定源码文件(例如`Exercise.scala`),并通过测试脚本来验证实现效果。在此过程中,开发者不仅可以加深对API的理解,还能掌握更多实用技巧。 此外,在构建基于Flink的应用程序时,了解其内部机制同样重要。比如,高吞吐量、低延迟及精确一次语义特性使得Flink成为理想的选择之一用于复杂事件处理场景;而这些特性的具体工作原理值得深入探究[^2]。 #### 三、高级主题探索 随着技能水平提升,还可以进一步研究更复杂的概念和技术——如Table API的数据处理能力。该接口允许用户以声明式的方式定义查询逻辑,从而简化了某些类型的ETL作业开发过程[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值