データラボ: CSV / JSON / Parquet を SQL で操作

DuckDB を使ってブラウザ内でローカルの CSV、TSV、JSON、NDJSON、Parquet ファイルをクエリし、表示された最大 200 行の結果を CSV としてエクスポートします。

ローカルエンジンDuckDB-Wasm 1.32.0CSV · TSV · JSON · NDJSON · ParquetSELECT / WITH クエリ
選択されたファイルは、このブラウザ内の SQL エンジンによって読み取られます。KivTools はファイル、クエリ、クエリ結果をアップロードしません。
ローカル SQL クエリ

読み込んだファイルは次のテーブルとして公開されます data. ワークスペースを非破壊的に保つため、このツールは SELECT および WITH クエリのみを受け付け、最大 200 行を表示します。

クエリ結果
ローカルファイルを読み込み、SELECT クエリを実行します。

データをアップロードせずに分析

Data Lab は、スキーマの迅速な確認、特定の SQL スライス、またはローカル Parquet のプレビューに便利です。アクセス制御された本番環境の分析の代替にはならず、URL を開いたり、選択したファイルを KivTools に送信したりすることはありません。

ローカルデータファイルに SQL クエリを実行する手順

CSV、TSV、JSON、NDJSON、Parquet のファイルを読み込み、SQL で照会できます。ページはファイルをタブ内で動く DuckDB エンジンに渡し、テーブル data として公開して、SELECT または WITH 文の結果をそのまま書き出せる表として表示します。エンジンは Web Worker 内の DuckDB-Wasm 1.32.0 で、ファイルのバイト列はその Worker にだけ渡されます。

対象は意図的に絞っています。一度に 1 ファイル、読み取り専用の文、表示は最大 200 行です。この範囲で、ダンプを取り込む前のスキーマ確認、書き出したレポートへの GROUP BY、デスクトップのビューアーがない Parquet の中身の確認といった用途はカバーできます。データベースを立てる必要はありません。

  1. ローカルデータファイルでファイルを選び、選択したファイルを読み込むを押します。選択できるのは .csv、.tsv、.json、.ndjson、.jsonl、.parquet、.txt で、.txt はカンマ区切り CSV として読まれます。読み込みが終わると状態行にファイル名が出ます(例:「orders.csv をローカルテーブル data として読み込みました。下で SELECT クエリを実行してください。」)。
  2. 下の入力欄に data への文を書くか、既定の SELECT * FROM data LIMIT 100 をそのまま使います。ファイルを用意せずに試すときはサンプルデータを読み込むを押してください。4 行の小さな CSV(id、name、team、monthly_events)と、3 行を返す GROUP BY のクエリが読み込まれます。
  3. クエリを実行を押すとブラウザー内で文が動きます。結果テーブルにはエンジンが返した列名と最大 200 行が並び、上の指標にはファイル、列数、画面に出ている行数が出ます。200+ のような値は、結果がプレビューより長かったことを意味します。
  4. 表示中の CSV をエクスポートを押すと、画面に出ている行だけをヘッダー付きで kivtools-query-results.csv として保存します。クエリをリセットは既定の文に戻し、表を空にします。エクスポートは、クエリが行を返すまで押せません。

クエリが動く場所、読み取れる形式、200 行という上限の正体

読み込める形式、テーブル data、SELECT 限定のルール

CSV と TXT は CSV リーダー、TSV は同じリーダーにタブ区切りを指定して読み、JSON と NDJSON/JSONL は JSON リーダー、Parquet は Parquet リーダーが担当します。列の型は自分で宣言するのではなくファイルから推定されます。読み込んだ内容は data というビューに入り、別のファイルを読むと置き換わります。2 つ目のテーブルはなく、2 つのファイルを結合することもできません。

受け付けるのは SELECT か WITH で始まる文だけです。DROP TABLE data と DELETE FROM data はエンジンに届く前に「安全のため、Data Lab は SELECT と WITH のクエリだけを実行します。」というメッセージで拒否されます。末尾のセミコロン 1 つは構いませんが、1 回の実行で動くのは 1 文です。SELECT 1; SELECT 2 は Parser Error になり、.xlsx のような未対応の拡張子は、対応形式を示すメッセージとともに拒否されます。

200 行は表示の上限であって、クエリの上限ではない

入力した文は SELECT * FROM (入力した文) AS kivtools_visible_result LIMIT 201 として実行され、ページは返ってきた行のうち最大 200 行を描画します。1,000 行の Parquet に対して SELECT * FROM data を実行すると、状態行は「200 行を表示(200 行に制限)」となり、指標は 200+ を示します。自分で ORDER BY salary DESC LIMIT 5 を書けば、きっかり 5 行が返ります。

表示中の CSV をエクスポートが書き出すのは、表に出ている内容、つまりヘッダー行とその最大 200 行だけで、結果全体ではありません。改行は CRLF です。5 行の集計結果ならデータ行は 5 行です。それ以上が必要なら、文の中で集計するか範囲を絞ってください。プレビューは読むためのもので、ファイルを丸ごと持ち出すためのものではありません。

クエリが失敗したときに分かること

エラーはエンジン自身のメッセージがそのまま表示されます。列名を間違えると Binder Error: Referenced column “nope” not found in FROM clause! Candidate bindings: “name”, “monthly_events”、存在しないテーブルなら Catalog Error: Table with name nowhere does not exist!、構文が壊れていれば位置を示した Parser Error、途中で切れた Parquet なら Invalid Input Error: No magic bytes found at end of file が出ます。

失敗した文は直前の結果を画面に残したままで、セッションも壊れません。次にクエリを実行を押せば普通に動き、ファイルも読み込まれたままです。失敗は壊れたページではなくメッセージとして返るので、ページを再読み込みしたりファイルを選び直したりせずに、入力欄で文を直せます。

速度、初回ダウンロード、プライバシー

Chrome での実測では、200,000 行を含む 6 MB の CSV は約 0.25 秒で照会可能になり、そのファイルへの GROUP BY とウィンドウ関数も同程度の時間で返りました。1,000 行・13 列の Parquet は最初の読み取りに数秒かかっています。初回のアクセスでは最初のクエリの前にエンジン(34 MB の WebAssembly と Apache Arrow のモジュール)をダウンロードしますが、2 回目以降はブラウザーのキャッシュから 1 秒ほどで起動します。

選んだファイルはタブ内で読まれます。バイト列はエンジンを載せた Web Worker に登録され、ファイル、入力した文、結果の行のいずれも KivTools には送られません。ブラウザーのネットワークパネルを開いた状態でも、読み込み済みのファイルへのクエリでリクエストは発生しません。その代わり、URL からファイルを取得することはできず、2 つのファイルが必要な問い合わせは 2 回に分けて実行します。

最近使ったツール: