flink datastream读取csv数据集并处理

从csv格式的数据集中读取数据,创建我自定义的GeoMessage对象,把对象放在集合里,通过flink的fromCollection()方法把集合作为数据源,然后通过实现map接口转换数据。

需要注意的是GeoMessage类必须继承实现序列化接口,即public class GeoMessage implements Serializable

import org.apache.flink.api.java.DataSet;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import test.GeoMessage;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.*;

public class FlinkCm {

    public static void main(String[] args) throws Exception {
        //创建流处理环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //创建集合,作为数据源
        Collection<GeoMessage> messageCollection = new HashSet<>();
        BufferedReader reader = new BufferedReader(new FileReader("your dataset path\\dataset1000.csv"));//换成你的文件名
        reader.readLine();//第一行信息,为标题信息,不用,如果需要,注释掉
        String line = null;
        //从csv文件中挑选部分数据创建GeoMessage对象
        while ((line = reader.readLine()) != null) {
            String item[] = line.split(",");//CSV格式文件为逗号分隔符文件,这里根据逗号切分
            String userID = item[0];
            String keyWords = item[1];
            double latitude = Double.parseDouble(item[4]);
            double longitude = Double.parseDouble(item[5]);
            String timeStamp = item[3];
            GeoMessage message = new GeoMessage(userID, keyWords, latitude, longitude, timeStamp);
            messageCollection.add(message);
        }
        //给流环境设置数据源
        DataStream<GeoMessage> input = env.fromCollection(messageCollection);
        //对数据通过map算子进行处理,具体方法为自定义的fun()方法
		DataStream<String> result2 = input.map(message -> fun(message));

        result2.print();        
        //启动任务执行,execute可以不给参数,参数是作业名字
        env.execute("Java WordCount from SocketTextStream Example");
    }
    //自定义的方法fun,打印message里的keywords
    private static String fun(GeoMessage message) {
        String kw = message.getKetWords();
        System.out.println(kw);
        System.out.println("#########");
        return kw;
    }
}

数据源是程序从中读取数据的来源。flink提供的多种添加数据源的方法,主要有从socket接收,从Kafka接收,从文件读取,从内存读取。

基于集合的source主要包括:

fromCollection(Collection) - 从Java Java.util.Collection创建数据流。集合中的所有元素必须属于同一类型。

fromCollection是从给定的集合中创建DataStream,StreamExecutionEnvironment提供了4种重载方法:

fromCollection(Collection data):通过给定的集合创建DataStream。返回数据类型为集合元素类型,我代码里使用的就是这个。
fromCollection(Collection data,TypeInformation typeInfo):通过给定的非空集合创建DataStream。返回数据类型为typeInfo。
fromCollection(Iterator data,Class type):通过给定的迭代器创建DataStream。返回数据类型为type。

fromParallelCollection(SplittableIterator, Class) - 并行地从迭代器创建数据流,class指定了迭代器返回的元素的数据类型

fromParallelCollection和fromCollection类似,但是是并行的从迭代器中创建DataStream。

fromParallelCollection(SplittableIterator data,Class type)
fromParallelCollection(SplittableIterator,TypeInfomation typeInfo)
和Iterable中Spliterator类似,这是JDK1.8新增的特性,并行读取集合元素。

fromElements(T …) - 从给定的对象序列创建数据流,所有对象必须属于同一类型

fromElements从给定的对象序列中创建DataStream,StreamExecutionEnvironment提供了2种重载方法:
fromElements(T… data):从给定对象序列中创建DataStream,返回的数据类型为该对象类型自身。
fromElements(Class type,T… data):从给定对象序列中创建DataStream,返回的数据类型type。

generateSequence(from, to) - 并行生成给定interval的数字序列

generateSequence(long from,long to)从给定间隔的数字序列中创建DataStream,比如from为1,to为10,则会生成1~10的序列。

参考博客:
https://blog.csdn.net/liewen_/article/details/89673372
https://www.jianshu.com/p/fc4fb559d9f4
https://www.jianshu.com/p/211d1f22aaae
https://www.cnblogs.com/wudeyun/p/13688745.html
https://blog.csdn.net/qq_37195258/article/details/106525446
https://blog.csdn.net/weixin_44844089/article/details/103201216?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
https://blog.csdn.net/lovebyz/article/details/78133807

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值