arrow系列25---读取json文件
作者:yunjinqi   类别:    日期:2023-10-17 09:05:33    阅读:505 次   消耗积分:0 分    


读取JSON文件 

逐行分隔的JSON文件可以通过TableReader读取为一个完整的Arrow表,也可以通过StreamingReader流式传输为RecordBatches。

这两种阅读器都需要表示输入文件的arrow::io::InputStream实例。它们的行为可以使用ReadOptions、ParseOptions和其他参数的组合进行自定义。

另请参见 JSON读取器API参考。

TableReader 

TableReader将整个文件一次性读取为一个表格。输入文件中的每个独立的JSON对象都会转换为输出表格中的一行。

#include "arrow/json/api.h"

{
   // ...
   arrow::Status st;
   arrow::MemoryPool* pool = default_memory_pool();
   std::shared_ptr<arrow::io::InputStream> input = ...;

   auto read_options = arrow::json::ReadOptions::Defaults();
   auto parse_options = arrow::json::ParseOptions::Defaults();

   // 从输入流和选项实例化TableReader
   std::shared_ptr<arrow::json::TableReader> reader;
   st = arrow::json::TableReader::Make(pool, input, read_options,
                                       parse_options, &reader);
   if (!st.ok()) {
      // 处理TableReader实例化错误...
   }

   std::shared_ptr<arrow::Table> table;
   // 从JSON文件中读取表格
   st = reader->Read(&table);
   if (!st.ok()) {
      // 处理JSON读取错误
      //(例如JSON语法错误或类型转换失败)
   }
}

StreamingReader 

StreamingReader以块的形式从文件中逐步读取,每个块具有大致相等的字节大小,每个块产生一个RecordBatch。块中的每个独立JSON对象都会转换为输出批次中的一行。

所有批次都遵循一致的模式,该模式是从第一个加载的批次派生的。或者,可以通过ParseOptions传递一个明确的模式。

#include "arrow/json/api.h"

{
   // ...
   auto read_options = arrow::json::ReadOptions::Defaults();
   auto parse_options = arrow::json::ParseOptions::Defaults();

   std::shared_ptr<arrow::io::InputStream> stream;
   auto result = arrow::json::StreamingReader::Make(stream,
                                                    read_options,
                                                    parse_options);
   if (!result.ok()) {
      // 处理实例化错误
   }
   std::shared_ptr<arrow::json::StreamingReader> reader = *result;

   for (arrow::Result<std::shared_ptr<arrow::RecordBatch>> maybe_batch : *reader) {
      if (!maybe_batch.ok()) {
         // 处理读取/解析错误
      }
      std::shared_ptr<arrow::RecordBatch> batch = *maybe_batch;
      // 对每个批次执行操作...
   }
}

数据类型 

由于JSON值是有类型的,因此输出的可能Arrow数据类型取决于输入值类型。顶级JSON值应始终是对象。顶级对象的字段被视为Arrow数据中的列。对于JSON对象中的每个名称/值对,有两种决定输出数据类型的可能模式:

  • 如果名称在ParseOptions::explicit_schema中,将尝试将JSON值转换为相应的Arrow数据类型;

  • 否则,通过对JSON值进行类型推断来确定Arrow数据类型,按顺序尝试多种Arrow数据类型。

以下表格显示了这两种模式的可能组合。

截图 2023-10-17 09-05-16.png


版权所有,转载本站文章请注明出处:云子量化, http://www.woniunote.com/article/358
上一篇:arrow系列24---读写csv文件
下一篇:arrow系列26---表格数据集1(Tabular Datasets)