DuckDB を使ってブラウザ内でローカルの CSV、TSV、JSON、NDJSON、Parquet ファイルをクエリし、表示された最大 200 行の結果を CSV としてエクスポートします。
読み込んだファイルは次のテーブルとして公開されます data. ワークスペースを非破壊的に保つため、このツールは SELECT および WITH クエリのみを受け付け、最大 200 行を表示します。
Data Lab は、スキーマの迅速な確認、特定の SQL スライス、またはローカル Parquet のプレビューに便利です。アクセス制御された本番環境の分析の代替にはならず、URL を開いたり、選択したファイルを KivTools に送信したりすることはありません。
CSV、TSV、JSON、NDJSON、Parquet のファイルを読み込み、SQL で照会できます。ページはファイルをタブ内で動く DuckDB エンジンに渡し、テーブル data として公開して、SELECT または WITH 文の結果をそのまま書き出せる表として表示します。エンジンは Web Worker 内の DuckDB-Wasm 1.32.0 で、ファイルのバイト列はその Worker にだけ渡されます。
対象は意図的に絞っています。一度に 1 ファイル、読み取り専用の文、表示は最大 200 行です。この範囲で、ダンプを取り込む前のスキーマ確認、書き出したレポートへの GROUP BY、デスクトップのビューアーがない Parquet の中身の確認といった用途はカバーできます。データベースを立てる必要はありません。
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 のような未対応の拡張子は、対応形式を示すメッセージとともに拒否されます。
入力した文は 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 回に分けて実行します。