Apache.Arrow 包今天不做任何计算。它将读入文件,您将可以访问数据的原始缓冲区。这对于许多中间任务(例如,将数据往返于或聚合数据文件的服务)来说已经足够了。因此,如果您想对数据进行大量操作,您可能需要某种数据框库。
一个这样的库是 Microsoft.Data.Analysis 库,它添加了 DataFrame 类型 can be created from an Arrow RecordBatch。这个blog post里面有库的一些解释和例子。
我使用该库的工作不多,但我能够整理一个读取 Arrow 文件并打印数据的简短示例:
using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using Apache.Arrow.Ipc;
using Microsoft.Data.Analysis;
namespace DataframeExperiment
{
class Program
{
static async Task AsyncMain()
{
using (var stream = File.OpenRead("/tmp/test.arrow"))
using (var reader = new ArrowFileReader(stream))
{
var recordBatch = await reader.ReadNextRecordBatchAsync();
Console.WriteLine("Read record batch with {0} column(s)", recordBatch.ColumnCount);
var dataframe = DataFrame.FromArrowRecordBatch(recordBatch);
var columnX = dataframe["x"];
foreach (var value in columnX)
{
Console.WriteLine(value);
}
}
}
static void Main(string[] args)
{
AsyncMain().Wait();
}
}
}
我用一个小的python脚本创建了测试文件:
import pyarrow as pa
import pyarrow.ipc as ipc
tab = pa.Table.from_pydict({'x': [1, 2, 3], 'y': ['x', 'y', 'z']})
with ipc.RecordBatchFileWriter('/tmp/test.arrow', schema=tab.schema) as writer:
writer.write_table(tab)
您大概也可以使用 C# 和 Apache.Arrow 的 array builders 创建测试文件。
更新(直接使用Apache.Arrow)
另一方面,如果您想直接使用Apache.Arrow,并且仍然可以访问数据,那么您可以使用类型化数组(例如 Int32Array、Int64Array)。您首先需要以某种方式确定数组的类型(通过事先了解架构或 as / is 样式检查或模式匹配)。
这是一个单独使用Apache.Arrow 的示例:
using System;
using System.IO;
using System.Threading.Tasks;
using Apache.Arrow;
using Apache.Arrow.Ipc;
namespace ArrayValuesExperiment
{
class Program
{
static async Task AsyncMain()
{
using (var stream = File.OpenRead("/tmp/test.arrow"))
using (var reader = new ArrowFileReader(stream))
{
var recordBatch = await reader.ReadNextRecordBatchAsync();
// Here I am relying on the fact that I know column
// 0 is an int64 array.
var columnX = (Int64Array) recordBatch.Column(0);
for (int i = 0; i < columnX.Values.Length; i++)
{
Console.WriteLine(columnX.Values[i]);
}
}
}
static void Main(string[] args)
{
AsyncMain().Wait();
}
}
}