Apache Parquetファイルを.NET Coreで読込む

csharpC#

この記事の内容

この記事では、Twitter社とCloudera社(米国のソフトウェア会社)で共同開発されたオープンソースの列指向(カラムナ)のデータストレージ形式である、「Apache Parquet」のファイルをプログラムで読み込む方法を紹介します。

プログラムはC#(.NET Core)を使用します。プログラムは単純に、スキーマ情報および行データを表示するサンプルを紹介します。

サンプルは以下のGitHubにて公開しています。

remix-yh/ParquetSampleApp
Contribute to remix-yh/ParquetSampleApp development by creating an account on GitHub.

プログラム

Parquetファイルの読み込みは、Parquet.Netを使用します。Parquet.NetはNugetより取得できます。

プログラムは以下の通りです。

using Parquet;
using Parquet.Data;
using Parquet.Data.Rows;
using System;
using System.Linq;

namespace ParquetSampleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // parquetファイル読込
            Table table = ParquetReader.ReadTableFromFile("./data/sample.parquet");

            //スキーマ情報の表示
            ShowSchema(table.Schema);

            Console.WriteLine();

            //行データを表示
            ShowRows(table);
        }

        static void ShowSchema(Schema schema)
        {
            Console.WriteLine("---------- Schema ----------");

            foreach (var field in schema.GetDataFields())
            {
                Console.WriteLine($"Name={field.Name}, SchemaType={field.DataType}");
            }
        }

        static void ShowRows(Table table)
        {
            Console.WriteLine("---------- Rows ----------");

            foreach (var row in table)
            {
                string values = String.Join(",", row.Values.Select(v =>
                 {
                     if(v is byte[])
                     {
                         return BitConverter.ToString((byte[])v);
                     }
                     return v.ToString();
                 }).ToArray());

                Console.WriteLine(values);
            }
        }
    }
}

出力結果

---------- Schema ----------
Name=id, SchemaType=Int32
Name=bool_col, SchemaType=Boolean
Name=tinyint_col, SchemaType=Int32
Name=smallint_col, SchemaType=Int32
Name=int_col, SchemaType=Int32
Name=bigint_col, SchemaType=Int64
Name=float_col, SchemaType=Float
Name=double_col, SchemaType=Double
Name=date_string_col, SchemaType=ByteArray
Name=string_col, SchemaType=ByteArray
Name=timestamp_col, SchemaType=DateTimeOffset

---------- Rows ----------
0,True,0,0,0,0,0,0,30-31-2F-30-31-2F-30-39,30,2009/01/01 0:00:00 +00:00
1,False,1,1,1,10,1.1,10.1,30-31-2F-30-31-2F-30-39,31,2009/01/01 0:01:00 +00:00

コメント