实时流处理中ReadStream读取.json文件时如何排除.json.meta文件?
过滤ReadStream中的.json.meta文件方案
核心解决思路是精确匹配目标文件后缀或主动排除.meta后缀文件,避免模糊匹配导致误读。以下是几种主流场景的具体实现:
1. 精确匹配.json后缀
直接筛选文件名严格以.json结尾的文件,彻底排除.json.meta这类后缀不符的文件:
Node.js 本地/云存储流处理示例
const fs = require('fs'); const path = require('path'); // 遍历目录时过滤文件 fs.readdir('./target-dir', (err, files) => { if (err) throw err; // 仅保留后缀为.json的文件 const validJsonFiles = files.filter(file => path.extname(file) === '.json'); validJsonFiles.forEach(file => { const readStream = fs.createReadStream(path.join('./target-dir', file)); // 后续流处理逻辑 }); });
Flink FileSource 示例
FileSource<String> jsonSource = FileSource.forRecordStreamFormat( new TextLineInputFormat(), new Path("s3://your-bucket/data-path") ) .filter(path -> path.getName().endsWith(".json")) // 过滤条件 .build();
2. 反向排除.meta后缀文件
通过正则或后缀匹配,直接排除所有.meta结尾的文件,适用于需要保留其他非.json但非.meta文件的场景:
Spark Streaming 示例
val jsonStream = spark.readStream .format("json") .option("path", "s3://your-bucket/target-path") .option("excludeRegex", ".*\\.meta$") // 正则排除.meta结尾的文件 .load()
3. 云存储层直接过滤(推荐)
如果使用S3、Azure Blob等云存储,可直接通过存储API的过滤能力获取目标文件,减少客户端侧的计算开销:
AWS S3 Python SDK 示例
import boto3 s3_client = boto3.client('s3') response = s3_client.list_objects_v2( Bucket="your-storage-bucket", Prefix="data-folder/", Filter={"Suffix": ".json"} // 仅列出.json后缀的对象 ) # 遍历返回的对象创建ReadStream for obj in response.get("Contents", []): file_stream = s3_client.get_object(Bucket="your-storage-bucket", Key=obj["Key"])["Body"] # 处理流数据
内容的提问来源于stack exchange,提问作者anuj
相关产品推荐
相关产品推荐

