NDJSON を SQL に変換

ここで NDJSON を SQL に変換できます。無料、アカウント不要です。ファイルを上の枠に落とせば、数秒で結果がダウンロードできる状態になります。 変換はお使いのブラウザーの中で行われるので、ファイルはアップロードされません。Windows でも macOS でも Linux でも、iPhone でも Android でも同じように動き、通信を切っても動き続けます。

  • 処理される場所 ブラウザーの中です。ファイルがアップロードされることはありません。
  • 作り直し SQLはNDJSONとは仕組みが違います。非可逆コーデックのような段階的な劣化ではありません。SQLが表現できるものは忠実に再現され、対応するものがないものはまったく残りません。
  • ファイルサイズの上限 1ファイルあたり100MBまで。無料、アカウント不要です。
  • 知っておきたいこと 入れ子のオブジェクトは平らにされて列になります。深く入れ子になったデータは形を失います。

一度に100ファイルまで。フォーマットが混ざっていても構いません。

ログをデータベースに一時的に入れたいとき

イベントログやアプリケーションの出力を、顧客テーブルと突き合わせたり、時間帯ごとに集計したりしたい場面があります。表計算ソフトでは面倒な集計も、SQL に入れてしまえば簡単に済むことがあります。

このページは NDJSON の各行を読み取り、対応する INSERT 文を1つずつ書き出します。

行数がそのまま文の数になる

空でない1行につき、INSERT 文が1つ生成されます。40万行のログファイルからは、40万個の INSERT 文が出力されます。CREATE TABLE 文やトランザクションの区切りは含まれません。

したがって、読み込み側の行数とログの行数が一致していれば、読み込みが完全に終わったことを確認できます。

ファイル全体を読んでから書き出す

列の一覧はファイル全体に出てくるキーの和集合として決まります。最後の行にしか現れないフィールドがあっても、それは列として扱われます。そのため、ファイルを最後まで読み終えるまで、1文も書き出せません。

この性質のため、変換全体がブラウザーのメモリー上で行われます。数十メガバイト程度は問題なく処理できますが、非常に大きなファイルは事前に分割しておくほうが確実です。

イベント種別が混在すると NULL だらけになる

リクエスト、エラー、ジョブ完了など、異なる種類のイベントが1つのログファイルに混在している場合、それぞれのキーの和集合がそのまま列になります。ある種類のイベントにしか存在しないキーは、他の行では NULL として埋められます。

一時的な分析であれば問題になりませんが、長く使うテーブルにするなら、種類ごとにファイルを分けてから変換するほうが、扱いやすいテーブルになります。

CREATE TABLE 文は出力されない

このページが生成するのは INSERT 文だけです。JSON からは、ある値が数値であることは分かっても、それが整数なのか小数を含む数値なのか、NULL を許すのかまでは分かりません。テーブルの定義は、変換した結果全体を見たうえで自分で書く必要があります。

列名を確認する際は、ファイル全体を変換した結果から拾うようにしてください。一部の行だけから作った列一覧では、まれにしか出てこないフィールドが漏れることがあります。

ネストしたフィールドはアンダースコア区切りの列名になる

構造化されたログレコードにはネストがよくあります。request オブジェクトの中の method のようなフィールドは、request_method のような1つの列名にまとめられます。

1段か2段のネストであれば読みやすい列名になりますが、深くネストした構造体をそのまま変換すると、列名が非常に長くなります。必要な部分だけを事前に取り出しておくほうが、読みやすいテーブルになります。

文字列のエスケープと、MySQL で気をつける点

数値はそのまま、真偽値は TRUE と FALSE、null は NULL として書き出されます。文字列は一重引用符で囲まれ、内部の一重引用符は二重に重ねて書かれます。この方式はどのデータベースでも読み取れます。

バックスラッシュはそのまま書き出されます。これは SQL 標準としては正しい扱いですが、初期設定の MySQL ではバックスラッシュをエスケープ文字として解釈するため、Windows のパスや正規表現を含む値では注意が必要です。

数十万行を超える場合の読み込み方

生成された文をそのまま1件ずつ実行すると、1文ごとに独立したトランザクションになり、非常に時間がかかります。ファイル全体を BEGIN と COMMIT で囲むだけで、読み込み時間は大きく改善します。

さらにインデックスを一時的に外してから読み込み、あとで作り直すことでも速度が上がります。件数が百万行を超えるような規模では、INSERT 文の代わりに一括読み込みの仕組みを使うほうが向いています。

不正な行があれば、変換はその場で止まる

いずれかの行が正しい JSON でない場合、変換は失敗し、該当する行番号が示されます。中途半端な結果は生成されません。

ログの途中が壊れているのは、たいてい書き込み中にプロセスが終了したことが原因です。行番号が分かれば、末尾を切り捨てて残りを確実に読み込むことができます。

ログはこのブラウザーの中だけで処理される

変換に使われるのはこのページに読み込まれた JavaScript だけです。ログファイルはどこにも送信されません。

イベントログには IP アドレスやセッション識別子、時にはトークンが含まれることがあります。障害対応のさなかに、そうしたファイルを外部サービスへ送るのは避けたい場面のはずです。

NDJSON を SQL に変換する手順

  1. お手元の NDJSON ファイル をこのページに落とすか、押してファイルを選んでください。
  2. 変換先に SQL を選びます。変換はブラウザーの中で行われ、ファイルはアップロードされません。
  3. できあがった SQL ファイル をダウンロードします。

NDJSON と SQL——何が変わるか

NDJSONとSQLの比較
NDJSONSQL
正式名称Newline-Delimited JSONSQL INSERT 文
拡張子.ndjson, .jsonl.sql
メディアタイプapplication/x-ndjsonapplication/sql
最初の公開20131986
仕様ISO/IEC 9075
ライセンスオープン標準オープン標準
現在の位置づけ現行現行
ブラウザで開けるか対応なし対応なし
代わりに検討される形式JSON, CSVCSV, Parquet

結果を開く

開くプログラムが重なりません。NDJSON はjqとpandasで、SQL はPostgreSQL、MySQL、DBeaverで開きます。結果を渡す相手には後者のどれかが要ります。

どちらの形式が何のためのものか

SQL は 1986 年から使われています。規定は ISO/IEC 9075 です。PostgreSQL、MySQL、DBeaverがこの形式を読めます。

SQL は 1986 年、NDJSON は 2013 年に登場しました。人に渡すならたいてい古いほうが安全で、新しいほうは同じ仕事をより少ないバイト数で片づけます。

NDJSON から SQL:よくある質問

NDJSON ファイル はどこかにアップロードされますか。

いいえ。この変換は完全にブラウザーの中で行われるので、ファイルが端末から出ることはありません。ご自分で確かめられます。開発者ツールのネットワークタブを開いて、何か変換してみてください。ページそのものと、このサービスの費用をまかなっている分析・広告のリクエストは見えますが、あなたのファイルを運んでいるリクエストはひとつもありません。

NDJSON から SQL への変換は無料ですか。

はい。アカウントも透かしもなく、消費される 1 日の割り当てもありません。お使いの機械の上で動くので、何度でも戻ってきていただけます。ブラウザーが扱えるのは 100 MB までのファイルで、一度に 100 本です。

NDJSON を SQL に変換すると品質は落ちますか。

NDJSON と SQL は、内容の表し方が根本から違います。ですからこの変換は複製ではなく再構築です。誠実ではありますが、1 バイトも同じというわけではありません。 入れ子のオブジェクトは平らにされて列になります。深く入れ子になったデータは形を失います。

できあがった SQL ファイル を開くのに、何かインストールが必要ですか。

変換には要りません。すでに開いているブラウザーの中で行われます。そのあと結果を開くには、お使いの端末がふだん SQL Insert Statements を表示するのに使っているソフトが必要です。

これらのフォーマットについて