从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