Java中如何读取HDFS存储的JSON格式文件并构造JSONArray返回
HDFS多JSON文件整合为JSONArray的实现方案
核心实现流程
- 调用已封装的
listeFilesHdfs方法,获取HDFS目标目录下的全量文件路径列表,过滤掉路径为目录的无效条目,避免后续读取时报错 - 初始化空
JSONArray对象作为最终整合结果的容器 - 逐个遍历文件路径,调用已封装的HDFS文件读取方法,拿到单文件的全量文本内容
- 对读取到的内容做空值校验,跳过空文件避免JSON解析异常
- 将单文件解析后的JSON内容追加到全局JSONArray中
- 遍历完成后释放对应的HDFS连接资源,返回最终的整合结果
参考实现代码
import org.json.JSONArray; import org.json.JSONObject; import java.io.IOException; import java.util.List; public JSONArray integrateHdfsJsonContent() throws IOException { // 复用已有的listeFilesHdfs方法获取HDFS全量文件列表 List<String> allHdfsFiles = listeFilesHdfs(); JSONArray finalResult = new JSONArray(); for (String path : allHdfsFiles) { // 复用已有的方法读取指定路径的HDFS文件文本内容 String content = readHdfsFileContent(path); // 空内容直接跳过,避免空指针/解析异常 if (content == null || content.trim().isEmpty()) { continue; } try { String normalizedContent = content.strip(); // 兼容两种常规文件结构:单JSON对象、单文件内嵌带方括号的JSON数组 if (normalizedContent.startsWith("[")) { JSONArray fileInnerArray = new JSONArray(normalizedContent); for (int i = 0; i < fileInnerArray.length(); i++) { finalResult.put(fileInnerArray.get(i)); } } else { JSONObject fileSingleObj = new JSONObject(normalizedContent); finalResult.put(fileSingleObj); } } catch (Exception parseException) { // 兜底处理格式异常的文件,可替换为正式日志打印逻辑 System.err.println("跳过无法解析的文件:" + path + ",错误信息:" + parseException.getMessage()); } } return finalResult; }
常见踩坑提醒
- 读取HDFS文件时要指定统一的UTF-8字符编码,避免中文乱码导致JSON解析失败
- 循环内不要反复创建HDFS
FileSystem连接实例,要复用全局连接,防止触发NameNode的连接数上限 - 如果单文件体积较大,不要一次性把全量内容读到内存,可以结合流式JSON解析器逐段读取内容,避免触发OOM
- 你提供的单文件示例是连续无外层方括号包裹的零散JSON对象,这种场景下不要直接把全量内容丢进常规JSONArray构造方法,会触发格式解析错误,需要换用流式JSON解析器,逐个识别完整的JSON对象边界后追加到结果数组
上述代码直接复用你已经编写完成的两个基础HDFS操作能力,不需要额外重新实现HDFS连接、文件读取的底层逻辑。
内容的提问来源于stack exchange,提问作者Isabelle
相关产品推荐
相关产品推荐

