2025/03/23 17:10 How arrow-rs is able to decode JSON so fast

やっほー、ロボ子! Arroyo 0.13がリリースされたのじゃ!

博士、こんにちは。Arroyo 0.13ですか。今回のリリースで特に注目すべき点は何でしょうか?

JSONデシリアライズの高速化じゃ! ストリーミングパイプラインでCPU時間の多くを占める部分だから、これは嬉しいのじゃ。

JSONデシリアライズの高速化、ですか。具体的にはどのような戦略が採用されているのでしょう?

Arrowをベースにした内部データ表現を使って、arrow-rsプロジェクトの高速JSONデコーダーを活用しているらしいぞ。へへ、よくわからん。

なるほど。arrow-rsプロジェクトですか。カラムナーJSONデコードを効率的に実行するarrow-jsonライブラリも使われているのですね。

そうそう! Flink SQLで使われるJacksonベースのデシリアライザより最大2.3倍も速いらしいぞ! 特に大規模で深くネストされたレコードに強いみたいじゃ。

2.3倍ですか! それはすごいですね。バッチ処理で高いパフォーマンスを発揮するカラムナーフォーマットの利点を活かしているのですね。

その通り! 複数のJSONドキュメントを、スキーマの各カラムを表す配列に変換するのじゃ。

simdjsonからのアイデアも取り入れられているとのことですが、具体的にはどのようなものでしょうか?

JSONの構造トークンを識別して、その位置を別々の配列に格納する2段階処理を採用しているらしいぞ。これでカラム単位での並列処理が可能になるのじゃ!

なるほど。ストリーミングをサポートするために、部分的なJSONドキュメントを継続的に処理できる機能も追加されているのですね。

そうじゃ! flushを呼び出すことで、Arrow RecordBatchを返すのじゃ。

デシリアライズアルゴリズムについても解説されていますね。JSONをフラット化された「テープ」データ構造に解析するとのことですが。

そうじゃ! 構造要素、文字列データ、数値リテラルを格納する複数のデータ構造を使うのじゃ。

カラム構築では、スキーマに従ってデコーダーのツリーを構築し、各デコーダーがdecode関数を実装するのですね。

その通り! カラムナー処理のために、各カラムのデータが格納されているテープのインデックスを特定するのじゃ。

Raw JSONという、任意のJSON値をエンコードされた文字列として格納できるArrow拡張タイプもあるのですね。

そう! JSONスキーマの複雑さに対応しきれない場合や、非構造化データに対応するために使うのじゃ。

JSONデータパイプラインでは、不正なデータも考慮する必要があるのですね。不正なデータを無視してパイプラインを続行できる「不正データ」処理設定があるとのことですが。

そうじゃ! スキーマに一致しないJSONを処理するために、各デコーダーにvalidate_rowメソッドを追加したのじゃ。

今後の改善点としては、テープデコーダーの最適化やSIMD最適化の追加などが挙げられているのですね。

その通り! 文字列バッファの構築を回避したり、null値が多い場合の処理を効率化したりするみたいじゃ。

今回のArroyo 0.13のリリースは、JSONデシリアライズの高速化に重点が置かれていることがよくわかりました。勉強になります。

へへー、どうじゃ? 褒めてつかわすぞ!

ありがとうございます、博士。ところで、博士の髪飾り、今日はいつもよりJSONっぽいですね。

むむ、よくぞ見破ったなロボ子! 実はこれ、最新のJSONデシリアライザで作ったアクセサリーなのじゃ! ...って、うそじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
