【问题标题】:Java Read Parquet File to JSON OutputJava 读取 Parquet 文件到 JSON 输出
【发布时间】:2019-02-04 16:46:20
【问题描述】:

正在读取 parquet 文件,但获取的是缩进格式,而不是所需的 JSON 输出格式。有任何想法吗?我在想我可能需要更改 GroupRecordConverter 但找不到太多文档。如果可以指出我,也会有所帮助。非常感谢您的帮助。

long num = numLines;
try {
  ParquetMetadata readFooter = ParquetFileReader.readFooter(conf, path, ParquetMetadataConverter.NO_FILTER);
  MessageType schema = readFooter.getFileMetaData().getSchema();
  ParquetFileReader r = new ParquetFileReader(conf,path,readFooter);

  PageReadStore pages = null;
  try{
    while(null != (pages = r.readNextRowGroup())) {
      final long rows = pages.getRowCount();
      System.out.println("Number of rows: " + rows);

      final MessageColumnIO columnIO = new ColumnIOFactory().getColumnIO(schema);
      final RecordReader recordReader = columnIO.getRecordReader(pages, new GroupRecordConverter(schema));
      String sTemp = "";
      for(int i=0; i<rows && num-->0; i++) {
        System.out.println(recordReader.read().toString())
      }
    }
  }
}

当前缩进输出:

data1: value1
data2: value2
models
  map
    key: data3
    value
      array: value3
  map
    key: data4
    value
      array: value4
data5: value5
...

所需的 JSON 输出:

"data1": "value1",
"data2": "value2",
"models": {
    "data3": [
        "value3"
    ],
    "data4": [
        "value4"
    ]
},
"data5": "value5"
...

【问题讨论】:

  • 你一定要使用 Parquet 来读取文件吗?能否请您也发布文件格式和内容?
  • 不,不一定要使用 Parquet,但如果可能的话更喜欢。文件格式为 .parquet 文件。抱歉,无法提供内容,但可以提供示例内容。谢谢。

标签: java json apache-spark hadoop parquet


【解决方案1】:

java parquet lib 的 cat 命令工具代码,也许可以作为一个例子...... 包含该行:

org.apache.parquet.tools.json.JsonRecordFormatter.JsonGroupFormatter formatter = JsonRecordFormatter.fromSchema(metadata.getFileMetaData().getSchema());

查看here获取完整源代码。

【讨论】:

  • 在尝试导入 org.apache.parquet.tools.json.JsonRecordFormatter 时出现错误无法解析符号“json”。为此需要什么版本的镶木地板工具?谢谢!
  • 您是否知道这需要什么版本的镶木地板工具?我仍然收到错误。谢谢
  • 看起来如果我使用 parquet-tools 1.9.0 版然后可以import org.apache.parquet.tools.json.JsonRecordFormatter;
  • @JustinWilson 您最后的评论是否意味着,以前的问题已经过时了?
【解决方案2】:

我将SimpleRecord源代码修改为JsonObject方法


protected Object toJsonObject() {
    Map<String, Object> result = Maps.newLinkedHashMap();

    if (arrayElement()) {
      return handleArrayElement(result);
    }

    for (NameValue value : values) {
      result.put(value.getName(), toJsonValue(value.getValue()));
    }

    return result;
  }

【讨论】:

    【解决方案3】:

    通过使用SimpleRecordMaterializer作为RecordMaterializer,我们可以实现JSON形式的输出,然后使用JsonRecordFormatter.JsonGroupFormatter

    这是一个示例片段,通过它我们可以实现:

    List<String> data = new ArrayList<>();
    ParquetFileReader reader = ParquetFileReader.open(HadoopInputFile.fromPath(new Path(filePath), new Configuration()));
    MessageType schema = reader.getFooter().getFileMetaData().getSchema();
    JsonRecordFormatter.JsonGroupFormatter formatter = JsonRecordFormatter.fromSchema(schema);
    PageReadStore pages;
    while ((pages = reader.readNextRowGroup()) != null) {
      long rows = pages.getRowCount();
      MessageColumnIO columnIO = new ColumnIOFactory().getColumnIO(schema);
      RecordReader recordReader = columnIO.getRecordReader(pages, new SimpleRecordMaterializer(schema));
    
      for (int i = 0; i < rows; i++) {
          SimpleRecord simpleRecord = (SimpleRecord) recordReader.read();
          String record = formatter.formatRecord(simpleRecord);
          ObjectMapper objectMapper = new ObjectMapper();
          String recordPretty = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(objectMapper.readTree(record));
          data.add(recordPretty);
      }
    }
    reader.close();
    

    【讨论】:

      猜你喜欢
      • 2018-12-13
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2023-03-27
      • 2019-01-20
      • 2017-01-22
      • 2019-07-26
      • 1970-01-01
      相关资源
      最近更新 更多