Parquet ビューアー・変換
データ変換
読み込み中
ツールを読み込んでいます
ツールのコードは開いたときにのみ読み込まれます。
このツールの処理はすべてブラウザー内で行われ、入力内容はサーバーへ送信されません。
このツールについて
内容をアップロードせずに、小さなローカル Parquet ファイルを確認できます。同梱の hyparquet リーダーがブラウザーのワーカーで動作し、UNCOMPRESSED または SNAPPY の対応するフラットな列を読み込みます。物理型、論理型の注釈、null の許容と本ツールの表現を確認し、行をページ表示して両端を含む範囲を書き出します。64 ビット整数、固定小数、バイナリー値、時間単位の正確な値はスキーマで説明する文字列になり、通常の真偽値と対応する有限数は型を保ちます。非対応の列は理由と unsupported:null の表現を付けてスキーマに残します。行の値は明示的な null の代替値で、復号した元の null ではありません。対応列は引き続き確認できます。結果の解釈や書き出し前に警告を確認してください。リモートファイルの取得、第三者 CDN の利用、ファイル内容の永続保存は行いません。
主な用途
- 上限内の分析データを別のツールに渡す前に、列名、null を許すフィールド、行数、物理型と論理型の違いと非対応列の警告を調べます。
- 元のファイルを変更せず、連続するレコードを表計算で確認するために取り出し、ヘッダーと文字列の数式保護を有効にします。
- null と空文字を区別し、大きな整数 ID、固定小数、タイムスタンプの単位を丸めない、スキーマ付き JSON サンプルを取得します。
使い方
- 1.ローカルの Parquet ファイルを 1 つ選んで読み込みます。検証後、スキーマ、行数、行グループを確認します。.parquet 拡張子だけでは有効なファイルと判断できません。非対応列の警告をすべて確認してください。その列はスキーマに残り、値は null の代替値になります。対応列は表示できます。非対応列の元の値が必要なら、完全なローカル Parquet ツールを使ってください。破損や上限超過は読み込みを失敗させ、部分結果を返しません。
- 2.前へ・次へで 25 行ずつ確認します。プレビューは先頭 12 列までで、セルは 500 文字を超えると省略表示します。全列はスキーマで確認し、null と型の表示も参照してください。ページ番号は表示用で、書き出す行の選択ではありません。
- 3.元のファイル順で、1 始まり・両端を含む開始行と終了行を入力し、CSV または JSON を選びます。0 行のファイルは 0–0 の空範囲で、スキーマまたはヘッダーだけを書き出します。有効な範囲の全列と完全な値が書き出され、プレビューの列非表示や省略には影響されません。表計算で確認する CSV は数式保護を有効に保ち、未保護 CSV は明示的に選んでください。キャンセル、リセット、ツールからの移動でメモリー内のファイルと結果を破棄するため、続ける場合はファイルを選び直します。
合成 Parquet ファイルによる実行可能な例
Unicode、null、基本型を保つ
{
"file": "mixed-snappy-v1.parquet",
"format": "json",
"start": 1,
"end": 5,
"safe": true,
"excerptColumns": [
"name",
"active",
"int32_value"
]
}{
"schemaExcerpt": [
{
"name": "name",
"physicalType": "BYTE_ARRAY",
"logicalType": "STRING",
"representation": "text",
"nullable": true,
"supported": true
},
{
"name": "active",
"physicalType": "BOOLEAN",
"logicalType": "NONE",
"representation": "boolean",
"nullable": true,
"supported": true
},
{
"name": "int32_value",
"physicalType": "INT32",
"logicalType": "NONE",
"representation": "number",
"nullable": true,
"supported": true
}
],
"range": {
"start": 1,
"end": 5
},
"rowsExcerpt": [
{
"name": "東京 · café 😀",
"active": true,
"int32_value": -2147483648
},
{
"name": "",
"active": false,
"int32_value": 2147483647
},
{
"name": "\\N",
"active": null,
"int32_value": 0
},
{
"name": "=SUM(1,2)\r\n\"quoted\",value",
"active": true,
"int32_value": -1
},
{
"name": null,
"active": false,
"int32_value": null
}
]
}合成ファイルは 14 列、5 行で、ここでは name、active、int32_value を抜粋しています。Unicode と空文字を保ち、null は false や数値ゼロと区別します。完全な JSON 出力には 14 個すべてのスキーマ項目と列を含みます。
Snappy 圧縮の v2 データページを読む
{
"file": "mixed-snappy-v2.parquet",
"format": "json",
"start": 1,
"end": 2,
"safe": true,
"excerptColumns": [
"name",
"int32_value"
]
}{
"schemaExcerpt": [
{
"name": "name",
"physicalType": "BYTE_ARRAY",
"logicalType": "STRING",
"representation": "text",
"nullable": true,
"supported": true
},
{
"name": "int32_value",
"physicalType": "INT32",
"logicalType": "NONE",
"representation": "number",
"nullable": true,
"supported": true
}
],
"range": {
"start": 1,
"end": 2
},
"rowsExcerpt": [
{
"name": "東京 · café 😀",
"int32_value": -2147483648
},
{
"name": "",
"int32_value": 2147483647
}
]
}独立したライターが作成したファイルで、SNAPPY、辞書値、データページ v2 を使用します。最初の 2 行の文字列と符号付き INT32 を保持します。excerptColumns は文書の抜粋指定で、書き出す列を選ぶ機能ではありません。
範囲の両端を含めて書き出す
{
"file": "mixed-uncompressed-v1.parquet",
"format": "json",
"start": 2,
"end": 3,
"safe": true,
"excerptColumns": [
"name",
"int32_value"
]
}{
"schemaExcerpt": [
{
"name": "name",
"physicalType": "BYTE_ARRAY",
"logicalType": "STRING",
"representation": "text",
"nullable": true,
"supported": true
},
{
"name": "int32_value",
"physicalType": "INT32",
"logicalType": "NONE",
"representation": "number",
"nullable": true,
"supported": true
}
],
"range": {
"start": 2,
"end": 3
},
"rowsExcerpt": [
{
"name": "",
"int32_value": 2147483647
},
{
"name": "\\N",
"int32_value": 0
}
]
}UNCOMPRESSED/PLAIN 版も同じレコードを含みます。start 2 と end 3 はファイル順の 2、3 行目を両方含みます。空文字と文字列のバックスラッシュ N は JSON で区別されます。例は 2 列だけですが、出力は全列です。
符号付き・符号なし 64 ビット整数を保つ
{
"file": "mixed-snappy-v1.parquet",
"format": "json",
"start": 1,
"end": 4,
"safe": true,
"excerptColumns": [
"id",
"uint64_value"
]
}{
"schemaExcerpt": [
{
"name": "id",
"physicalType": "INT64",
"logicalType": "NONE",
"representation": "integer:string",
"nullable": true,
"supported": true
},
{
"name": "uint64_value",
"physicalType": "INT64",
"logicalType": "UINT_64",
"representation": "integer:string",
"nullable": true,
"supported": true
}
],
"range": {
"start": 1,
"end": 4
},
"rowsExcerpt": [
{
"id": "-9223372036854775808",
"uint64_value": "18446744073709551615"
},
{
"id": "9223372036854775807",
"uint64_value": "9223372036854775808"
},
{
"id": "9007199254740993",
"uint64_value": "9007199254740993"
},
{
"id": "-9007199254740993",
"uint64_value": "0"
}
]
}INT64 と UINT64 はゼロも含めて正確な十進文字列です。2^53 を超える値と、符号付き・符号なし 64 ビットの端点を丸めません。スキーマが物理型、論理型、integer:string の表現を示します。
宣言された小数桁数を保つ
{
"file": "mixed-snappy-v1.parquet",
"format": "json",
"start": 1,
"end": 5,
"safe": true,
"excerptColumns": [
"amount"
]
}{
"schemaExcerpt": [
{
"name": "amount",
"physicalType": "FIXED_LEN_BYTE_ARRAY",
"logicalType": "DECIMAL(30,6)",
"representation": "decimal:string",
"nullable": true,
"supported": true
}
],
"range": {
"start": 1,
"end": 5
},
"rowsExcerpt": [
{
"amount": "9007199254740993.123456"
},
{
"amount": "-9007199254740993.000001"
},
{
"amount": "0.000001"
},
{
"amount": "0.000000"
},
{
"amount": null
}
]
}DECIMAL(30,6) は固定小数の文字列です。0.000001 と 0.000000 は 6 桁の小数を保ち、大きな金額も全桁を保持し、null は null のままです。二進浮動小数の計算を挟みません。
時間の値を解釈する前に単位を見る
{
"file": "mixed-snappy-v1.parquet",
"format": "json",
"start": 1,
"end": 4,
"safe": true,
"excerptColumns": [
"timestamp_us",
"timestamp_ns",
"date",
"time_us"
]
}{
"schemaExcerpt": [
{
"name": "timestamp_us",
"physicalType": "INT64",
"logicalType": "TIMESTAMP(MICROS,UTC)",
"representation": "timestamp:unit:string",
"nullable": true,
"supported": true
},
{
"name": "timestamp_ns",
"physicalType": "INT64",
"logicalType": "TIMESTAMP(NANOS,local)",
"representation": "timestamp:unit:string",
"nullable": true,
"supported": true
},
{
"name": "date",
"physicalType": "INT32",
"logicalType": "DATE(days since 1970-01-01)",
"representation": "date:days:string",
"nullable": true,
"supported": true
},
{
"name": "time_us",
"physicalType": "INT64",
"logicalType": "TIME(MICROS,UTC)",
"representation": "time:unit:string",
"nullable": true,
"supported": true
}
],
"range": {
"start": 1,
"end": 4
},
"rowsExcerpt": [
{
"timestamp_us": "-1",
"timestamp_ns": "-1",
"date": "-719162",
"time_us": "0"
},
{
"timestamp_us": "-1000001",
"timestamp_ns": "-1000000001",
"date": "-1",
"time_us": "1"
},
{
"timestamp_us": "0",
"timestamp_ns": "0",
"date": "0",
"time_us": "12345678901"
},
{
"timestamp_us": "9007199254740993",
"timestamp_ns": "9007199254740993",
"date": "20000",
"time_us": "86399999999"
}
]
}-1 は Date に変換せず、正確な単位数として保持します。timestamp_us は UTC 調整ありのマイクロ秒、timestamp_ns はローカル意味論のナノ秒です。DATE は 1970-01-01 からの日数、TIME は宣言単位です。完全なスキーマにこれらの表示が残ります。
空のバイナリーと null を区別する
{
"file": "mixed-snappy-v1.parquet",
"format": "json",
"start": 1,
"end": 5,
"safe": true,
"excerptColumns": [
"binary",
"fixed_binary"
]
}{
"schemaExcerpt": [
{
"name": "binary",
"physicalType": "BYTE_ARRAY",
"logicalType": "NONE",
"representation": "binary:hex",
"nullable": true,
"supported": true
},
{
"name": "fixed_binary",
"physicalType": "FIXED_LEN_BYTE_ARRAY",
"logicalType": "NONE",
"representation": "binary:hex",
"nullable": true,
"supported": true
}
],
"range": {
"start": 1,
"end": 5
},
"rowsExcerpt": [
{
"binary": "0x00ff80",
"fixed_binary": "0x00ff8001"
},
{
"binary": "0x",
"fixed_binary": "0x00000000"
},
{
"binary": "0x000102030405060708090a0b0c0d0e0f",
"fixed_binary": "0x41424344"
},
{
"binary": "0x5c4e",
"fixed_binary": "0xfffefdfc"
},
{
"binary": null,
"fixed_binary": null
}
]
}バイナリーは 0x 付きの小文字 16 進文字列です。空のバイト列は 0x、null は null です。確認用の表現であり、任意のバイトを UTF-8 として復号するわけではありません。
特殊な浮動小数を保持する
{
"file": "mixed-snappy-v1.parquet",
"format": "json",
"start": 1,
"end": 5,
"safe": true,
"excerptColumns": [
"float64_value",
"float32_value"
]
}{
"schemaExcerpt": [
{
"name": "float64_value",
"physicalType": "DOUBLE",
"logicalType": "NONE",
"representation": "float:number-or-special-string",
"nullable": true,
"supported": true
},
{
"name": "float32_value",
"physicalType": "FLOAT",
"logicalType": "NONE",
"representation": "float:number-or-special-string",
"nullable": true,
"supported": true
}
],
"range": {
"start": 1,
"end": 5
},
"rowsExcerpt": [
{
"float64_value": "NaN",
"float32_value": "NaN"
},
{
"float64_value": "+Infinity",
"float32_value": "+Infinity"
},
{
"float64_value": "-Infinity",
"float32_value": "-Infinity"
},
{
"float64_value": "-0",
"float32_value": "-0"
},
{
"float64_value": 1.25,
"float32_value": 1.5
}
]
}NaN、正負の無限大、負のゼロはスキーマで説明する明示的な文字列です。有限値 1.25、1.5 は JSON 数値のままです。JSON.stringify が非有限値を黙って null にしたり、負のゼロを失ったりすることを避けます。
複数行の数式風文字列を保護する
{
"file": "mixed-snappy-v1.parquet",
"format": "csv",
"start": 4,
"end": 4,
"safe": true,
"excerptColumns": [
"name",
"int32_value"
]
}{
"csvRecordsExcerpt": [
[
"name",
"int32_value"
],
[
"'=SUM(1,2)\r\n\"quoted\",value",
"-1"
]
]
}通常の CSV 解析後の一部の列を示しており、14 列の完全な CSV ではありません。数式保護で危険な文字列の先頭にアポストロフィを付けます。値内のカンマ、引用符、CRLF は保持します。数値 INT32 の -1 はそのままですが、危険な文字列で表す正確な値には保護が付く場合があります。
未保護 CSV の null とバックスラッシュを戻す
{
"file": "mixed-snappy-v1.parquet",
"format": "csv",
"start": 2,
"end": 5,
"safe": false,
"excerptColumns": [
"name",
"active"
]
}{
"csvRecordsExcerpt": [
[
"name",
"active"
],
[
"",
"false"
],
[
"\\\\N",
"\\N"
],
[
"=SUM(1,2)\r\n\"quoted\",value",
"true"
],
[
"\\N",
"false"
]
]
}CSV 解析後の値を示しています。元の文字列バックスラッシュ N は先頭が 2 つになり、本当の null は 1 つのバックスラッシュ N です。空文字は空のままです。未保護モードは数式風文字列を残すため表計算では危険な場合がありますが、null とバックスラッシュの規則は適用します。
入れ子の代替値と対応列を同時に保つ
{
"file": "unsupported-struct.parquet",
"format": "json",
"start": 1,
"end": 2,
"safe": true,
"excerptColumns": [
"flat_id",
"nested"
]
}{
"schemaExcerpt": [
{
"name": "flat_id",
"physicalType": "INT32",
"logicalType": "NONE",
"representation": "number",
"nullable": true,
"supported": true
},
{
"name": "nested",
"physicalType": "GROUP",
"logicalType": "NONE",
"representation": "unsupported:null",
"nullable": true,
"supported": false,
"reason": "nested"
}
],
"range": {
"start": 1,
"end": 2
},
"rowsExcerpt": [
{
"flat_id": 1,
"nested": null
},
{
"flat_id": 2,
"nested": null
}
]
}flat_id は 1、2 のままです。入れ子は supported:false、reason nested、unsupported:null を持つ GROUP スキーマ項目として残ります。元の入れ子の値が異なっていても、例の null はどちらも代替値です。JSON のスキーマで復号した nullable 列と区別します。
非対応の圧縮方式を明示する
{
"file": "unsupported-gzip.parquet",
"format": "json",
"start": 1,
"end": 3,
"safe": true,
"excerptColumns": [
"value"
]
}{
"schemaExcerpt": [
{
"name": "value",
"physicalType": "INT32",
"logicalType": "NONE",
"representation": "unsupported:null",
"nullable": true,
"supported": false,
"reason": "codec"
}
],
"range": {
"start": 1,
"end": 3
},
"rowsExcerpt": [
{
"value": null
},
{
"value": null
},
{
"value": null
}
]
}このビューアーは GZIP を復号しません。value 列は reason codec とともにスキーマに残り、全行を null の代替値にします。元のセルの値を表す結果ではなく、復元には完全な Parquet リーダーが必要です。CSV 単独ではこの説明が失われます。
Parquet 確認時のよくある誤り
- すべての .parquet ファイルの型・符号化・圧縮が対応済みと考える、または非対応列の代替値を元の null と取り違える。
- スキーマが INT64 や DECIMAL と説明する文字列を、丸めが起きる浮動小数に変換する。
- 単位と UTC 調整フラグを確認せず、タイムスタンプの単位数をミリ秒と解釈する。
- プレビューの省略や非表示の列を、成功した書き出しのデータ欠落と取り違える。
- 0 始まりの行番号を使う、または終了行が書き出しに含まれないと考える。
- CSV の \N を通常の文字列と読む、またはエスケープ文字列に追加された先頭のバックスラッシュを戻し忘れる。
- キャンセル、リセット、ファイル変更の後にも古いワーカーセッションが残ると期待する。
- 信頼できない未保護 CSV を表計算で開く、または二重引用符だけで数式実行を防げると思う。
制限と注意事項
- 入力は 1 ファイル、8 MiB、10,000 行、128 列、200,000 データセルまでです。対応する復号済みデータページ合計は 32 MiB までです。テキストセルと元のバイナリーセルは各 256 KiB までで、バイナリーの 16 進文字列は 512 KiB と 2 文字の接頭辞までになります。フッターは 1 MiB、メタデータは 256 行グループ、対応データは 8,192 ページまで、列名は UTF-8 で 128 バイトまでです。各書き出しは 8 MiB までです。読み込み、ページ表示、書き出しには 10 秒の期限があります。上限超過は操作を失敗させ、部分ファイルや短縮した書き出しを黙って返しません。プレビューは 25 行ずつ、先頭 12 列、セル当たり 500 文字までです。ワーカー、サイズ検査、キャンセルは負荷を抑える手段であり、ブラウザーの総メモリーの厳密な上限や、悪意ある入力による資源枯渇を防ぐ保証ではありません。
- 復号できる範囲はフラットな必須・任意の基本型列、データページ v1/v2、PLAIN または辞書による値の符号化、UNCOMPRESSED または SNAPPY 圧縮です。対応する物理値は、互換性のある論理型注釈を持つ BOOLEAN、INT32、INT64、FLOAT、DOUBLE、BYTE_ARRAY、FIXED_LEN_BYTE_ARRAY です。入れ子のグループ、LIST/MAP/反復列、INT96、未知の論理型、他の値の符号化と圧縮は、非対応として理由を示すスキーマと null の代替値を保持し、対応列は読み込みます。代替値は復号した元の null ではなく、元の値も復元できません。暗号化ファイル、外部の列ファイル、破損、リモート URL は受け付けません。完全な Parquet 仕様や上流ライブラリーより狭い対応範囲です。 既知の物理型と論理型の不正な組み合わせは検証に失敗します。非対応列のペイロードは読み飛ばし、展開や完全性検証をしません。対応列を読めても、元ファイルの全バイトが有効とは限りません。
- INT64 と UINT64 は JavaScript の数値に安全に収まる場合も十進文字列です。DECIMAL は宣言された小数桁数を保つ正確な固定小数文字列、バイナリーは 0x 付きの 16 進文字列です。DATE、TIME、TIMESTAMP は、宣言された日または時間単位の正確な整数文字列を保ちます。論理型の単位と UTC 調整フラグを確認してください。整形済みの日時やタイムゾーン変換済みの JavaScript Date ではありません。有限の浮動小数は数値を保ち、NaN、+Infinity、-Infinity、負のゼロはスキーマで説明する明示的な文字列になります。非対応の型はスキーマに明示し、null の代替値で表します。null の解釈前に supported と reason を確認してください。
- JSON は schema、選択した range、行オブジェクトの rows を含む形式です。スキーマには各列の name、physicalType、logicalType、representation、nullable、supported、reason を記録します。対応列の元の null は JSON null、空文字は空文字列のまま、正確な値は規定の文字列表現を保ちます。非対応列の representation は unsupported:null、行は null の代替値です。スキーマに理由が残るため、元の null と解釈しないでください。確認しやすい出力形式であり、Parquet の再エンコードや、別アプリで元の全メタデータを復元する保証ではありません。行範囲は 1 始まりで両端を含む連続範囲です。フィルター、並べ替え、任意行の選択、SQL クエリではありません。 0 行のファイルもスキーマを表示し、start 0 / end 0 の空範囲だけを許可します。rows [] を持つ JSON またはヘッダーのみの CSV を出力します。
- CSV は UTF-8、カンマ区切り、CRLF 改行で、ヘッダーと null 以外の値を引用符で囲みます。null は引用符なしの \N です。バックスラッシュで始まる null 以外の文字列値には、先頭にもう 1 つバックスラッシュを付けます。文字列の \N は CSV 解析後に \\N になります。復元時は完全一致する \N だけを null にし、他の値で先頭が 2 つのバックスラッシュなら 1 つ除きます。CSV に Parquet スキーマや非対応列の理由は含まれず、代替 null と元の null を CSV 単独で区別できません。重要な場合は JSON を使ってください。既定の数式保護は危険なヘッダーと文字列表現の値の前にアポストロフィを付け(負の INT64、固定小数、時間単位の文字列も含みます)、意図的に文字列を変更します。未保護 CSV でも null とバックスラッシュの規則は残ります。未保護 CSV は数式実行や表計算の型変換を招く場合があります。ファイル名は parquet-rows.csv または parquet-rows.json です。プレビューの省略は成功した書き出しを短縮しません。キャンセル、タイムアウト、ワーカー失敗、ファイル変更、リセット、ツールからの移動でセッションを解放しますが、ダウンロード済みのファイルは端末に残ります。
よくある質問
大きな整数、小数、タイムスタンプが文字列になるのはなぜですか?
通常の JavaScript 数値や Date に変換すると、整数の丸め、小数桁数の変更、ミリ秒未満の精度損失が起こり得ます。本ツールは INT64/UINT64 を十進文字列、DECIMAL を固定小数文字列、時刻の値を正確な単位数として保持します。JSON のスキーマが単位と UTC 調整を含む解釈方法を示し、表示タイムゾーンは推測しません。
CSV で null、空文字、文字列の \N を区別できますか?
null は \N という値です。バックスラッシュで始まる実際の文字列には先頭にもう 1 つ付けるため、文字列の \N は CSV 解析後に \\N となり、空文字は空のままです。完全一致する \N を null にし、それ以外で先頭が 2 つのバックスラッシュなら 1 つ除いて復元します。ただし CSV には型情報と、非対応列の null 代替値の理由は含まれません。その違いを保持するには JSON 形式を使ってください。
非対応の Parquet 列はどうなりますか?
列は supported:false、理由、representation unsupported:null を付けてスキーマに残ります。表示・書き出しは null の代替値となり、対応列は読み込めます。代替値を元の null と解釈しないでください。入れ子、INT96、非対応の論理型・符号化・圧縮でこの動作になります。メタデータ破損、対応データの不正、資源上限超過は読み込みを失敗させます。非対応列の元の値には完全な Parquet ツールを使ってください。
範囲の書き出しは表示中のプレビューだけですか?
いいえ。開始行と終了行は元のファイル順の 1 始まりで、両端を含みます。成功した書き出しは、その範囲の全列と完全な値を含み、表示中のページ、12 列の表示上限、500 文字の省略に左右されません。不正な範囲や大きすぎる出力は拒否します。空ファイルは特別な 0–0 の範囲だけで、データ行なしのスキーマまたはヘッダーを書き出します。キャンセルやリセットで読み込み済みセッションを破棄するため、ファイルを読み直す必要があります。
- Apache Parquet:ファイル構造と行グループ
- Apache Parquet:論理型の定義
- hyparquet:JavaScript の Parquet リーダー
- OWASP:CSV 数式インジェクション