flink java 语言 readfile读取hdfs上的csv文件并开启流处理

在flink中针对读取csv文件的输出可以有3种格式,都是通过引用inputFormat来控制的,分别为 PojoCsvInputFormat输出类型为pojo, RowCsvInputFormat输出类型为Row, TupleCsvInputFormat输出类型为Tuple。本例子就用RowCsvInputFormat。

可以进入到RowCsvInputFormat 看看其构造函数都有哪些

public RowCsvInputFormat(
			Path filePath,
			TypeInformation[] fieldTypeInfos,
			String lineDelimiter,
			String fieldDelimiter,
			int[] selectedFields,
			boolean emptyColumnAsNull) {

		super(filePath);
		this.arity = fieldTypeInfos.length;
		if (arity != selectedFields.length) {
			throw new IllegalArgumentException("Number of field types and selected fields must be the same");
		}

		this.fieldTypeInfos = fieldTypeInfos;
		this.fieldPosMap = toFieldPosMap(selectedFields);
		this.emptyColumnAsNull = emptyColumnAsNull;

		boolean[] fieldsMask = toFieldMask(selectedFields);

		setDelimiter(lineDelimiter);
		setFieldDelimiter(fieldDelimiter);
		setFieldsGeneric(fieldsMask, extractTypeClasses(fieldTypeInfos));
	}

	public RowCsvInputFormat(Path filePath, TypeInformation[] fieldTypes, String lineDelimiter, String fieldDelimiter, int[] selectedFields) {
		this(filePath, fieldTypes, lineDelimiter, fieldDelimiter, selectedFields, false);
	}

	public RowCsvInputFormat(Path filePath, TypeInformation[] fieldTypes, String lineDelimiter, String fieldDelimiter) {
		this(filePath, fieldTypes, lineDelimiter, fieldDelimiter, sequentialScanOrder(fieldTypes.length));
	}

	public RowCsvInputFormat(Path filePath, TypeInformation[] fieldTypes, int[] selectedFields) {
		this(filePath, fieldTypes, DEFAULT_LINE_DELIMITER, DEFAULT_FIELD_DELIMITER, selectedFields);
	}

	public RowCsvInputFormat(Path filePath, TypeInformation[] fieldTypes, boolean emptyColumnAsNull) {
		this(filePath, fieldTypes, DEFAULT_LINE_DELIMITER, DEFAULT_FIELD_DELIMITER, sequentialScanOrder(fieldTypes.length), emptyColumnAsNull);
	}

	public RowCsvInputFormat(Path filePath, TypeInformation[] fieldTypes) {
		this(filePath, fieldTypes, false);
	}

从上面的构造函数中可以看出可以接受的参数为:
Path filePath,csv文件的路径,
TypeInformation[] fieldTypeInfos, 输入的数据的类型,这个也是按列来对应的
String lineDelimiter, 行分隔符
String fieldDelimiter, 列分隔符
int[] selectedFields, 选择的列,当不是全部都选择的情况下,就在这个参数中输入选择的列的index就可以了。
boolean emptyColumnAsNull , 当当前得的值为空的情况,这个值设置为true。

例子如下:
//值得注意的是 选择的行数和每行对应的类型数要匹配。

String pathString = "hdfs://hostname:9000/flinkCsv/csvTese.csv";
String charsetName = "UTF-8";
int interval = 10;
Path path = new Path(pathString);
String lineDelimiter = "\n";
String fieldDelimiter = ",";
Boolean setEmptyColumnAsNull = true;

// 5行的类型都为string
TypeInformation[] fieldTypeInfos = new TypeInformation[5];
for(int i = 0; i < 5; i++)
{
	fieldTypeInfos[i] = TypeINformation.of(String.class);	
}

//选择前5行输出
int[] select = new int[5];
for(int i = 0; i< 5; i++)
{
	select[i] = i;
}

RowCsvInputFormat format = new  RowCsvInputFormat(newPath(path),fieldTypeInfos,select,lineDelimiter, fieldDelimiter,setEmptyColumnAsNull);
format.setNestedFileEnumeration(true);

DataStreamSource<ROW> text = env.readTextFile(format,path,FileProcessingMode.PROCESS_CONTINUOUSLY,interval)

最后输出的类型为flink中的row类型。
开启流处理就是format.setNestedFileEnumeration(true);设置为true并FileProcessingMode.PROCESS_CONTINUOUSLY 为continuoulsy

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 好的,以下是一个Java代码示例,可以使用FlinkHDFS读取多个文件: ``` import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.io.TextInputFormat; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.core.fs.Path; public class HDFSReader { public static void main(String[] args) throws Exception { // 创建Flink执行环境 ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); // 设置HDFS文件路径 Path filePath1 = new Path("hdfs://localhost:9000/path/to/first/file"); Path filePath2 = new Path("hdfs://localhost:9000/path/to/second/file"); // 使用TextInputFormatHDFS读取文件内容 TextInputFormat inputFormat = new TextInputFormat(filePath1); TextInputFormat inputFormat2 = new TextInputFormat(filePath2); // 读取文件内容 env.readFile(inputFormat, filePath1.toString()) .union(env.readFile(inputFormat2, filePath2.toString())) .flatMap((String line, Collector<Tuple2<String, Integer>> out) -> { // 对每行数据进行处理 String[] tokens = line.toLowerCase().split("\\W+"); for (String token : tokens) { if (token.length() > 0) { out.collect(new Tuple2<>(token, 1)); } } }) .groupBy(0) .sum(1) .print(); } } ``` 在这个示例中,我们创建了一个`ExecutionEnvironment`对象,该对象是Flink程序的核心部分,用于执行计算。我们然后指定了多个HDFS文件的路径,并使用`TextInputFormat`来读取文件内容。然后我们使用`readFile`方法从每个文件读取数据,使用`union`方法将所有数据合并为一个数据集,然后使用`flatMap`方法将每行数据转换为一个元组,其中元组包含单词和计数器1。然后我们使用`groupBy`方法按单词对数据进行分组,并使用`sum`方法计算每个单词出现的次数。最后,我们使用`print`方法打印结果。 ### 回答2: 使用Flink读取HDFS上多个文件Java代码如下: ```java import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.core.fs.Path; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.api.java.DataSet; public class ReadMultipleFilesFromHDFS { public static void main(String[] args) throws Exception { // 创建环境 ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); // 设置Hadoop配置,指定HDFS路径 env.getConfig().setGlobalJobParameters(org.apache.flink.configuration.Configuration.fromArgs(args)); // 从HDFS读取多个文件 DataSet<String> text = env.readTextFile("hdfs://path/to/directory/*.txt"); // 对读取的数据进行处理 DataSet<String> result = text.flatMap((String line, Collector<String> out) -> { String[] words = line.split(" "); for (String word : words) { out.collect(word); } }).groupBy("word").sum(1); // 打印结果 result.print(); } } ``` 在代码中,`ExecutionEnvironment`用于批处理,而`StreamExecutionEnvironment`用于处理。根据实际需求选择适合的环境。`readTextFile`方法用于从HDFS读取文本文件,可以使用通配符来处理多个文件读取文件内容会存储在`DataSet`中,按行处理后可以对数据进行各种操作,如拆分、过滤、聚合等。最后,通过调用`print`方法将结果输出。当需要将结果存储到HDFS中时,可以使用`writeAsTextFile`等方法。 ### 回答3: 使用Flink读取HDFS上的多个文件可以使用`TextInputFormat`和`readFile`方法来实现。下面是一个示例的Java代码: ``` import org.apache.flink.api.java.io.TextInputFormat; import org.apache.flink.core.fs.Path; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class FlinkReadHDFSFiles { public static void main(String[] args) throws Exception { final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 设置Hadoop配置,指定HDFS文件系统 env.getConfig().setBoolean("fs.hdfs.hadoopconf", true); // 设置要读取HDFS文件路径 String hdfsPath = "hdfs://localhost:9000/path/to/files/"; // 创建TextInputFormat,并指定要读取文件路径 TextInputFormat inputFormat = new TextInputFormat(new Path(hdfsPath)); // 使用readFile方法读取HDFS上的多个文件,返回一个DataStream DataStream<String> dataStream = env.readFile(inputFormat, hdfsPath); // 对DataStream进行相应的操作,如打印结果等 dataStream.print(); // 执行Flink任务 env.execute("Flink Read HDFS Files"); } } ``` 注意事项: 1. 需要将`hadoop-common`和`hadoop-hdfs`的依赖添加到项目的`pom.xml`文件中。 2. 需要根据实际情况修改HDFS的配置信息,如HDFS的地址和待读取文件路径。 3. 可以根据具体需求对`dataStream`进行相应的操作,例如进一步处理数据或将结果输出到其他存储系统。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值