Skip to main content
このチュートリアルでは、CSV フォーマットと Parquet フォーマットの両方から 2,800 万行の Hacker News データを ClickHouse テーブルに挿入し、簡単なクエリをいくつか実行してデータを確認します。

CSV

1

CSV をダウンロード

このデータセットの CSV 版は、公開 S3 bucket からダウンロードするか、次のコマンドを実行して取得できます。
4.6GB、2,800万行のこの圧縮ファイルのダウンロードには、5〜10分かかるはずです。
2

データをサンプリングする

clickhouse-local を使うと、ClickHouse server をデプロイして設定しなくても、 ローカルファイルを高速に処理できます。データを ClickHouse に保存する前に、clickhouse-local を使ってファイルをサンプリングしてみましょう。 コンソールから次を実行します。
次に、データを確認するには、次のコマンドを実行します。
Query
Response
このコマンドには、見逃しがちな便利な機能が数多くあります。 file operator を使うと、CSVWithNames フォーマットを指定するだけで、ローカルディスク上のファイルを読み込めます。 特に重要なのは、ファイルの内容からスキーマが自動的に推論されることです。 また、clickhouse-local は圧縮ファイルも読み込むことができ、拡張子から gzip フォーマットを推論している点にも注目してください。 Vertical フォーマットを使うと、各カラムのデータをより見やすく表示できます。
3

スキーマ推論を使ってデータをロードする

データのロードに最も簡単で強力なツールは、clickhouse-client です。これは、多機能なネイティブのコマンドラインクライアントです。 データをロードする際は、再度スキーマ推論を活用し、ClickHouse にカラムの型の判定を任せることができます。以下のコマンドを実行すると、url 関数を使ってリモートの CSV ファイルの内容にアクセスし、テーブルを作成してデータを直接挿入できます。 スキーマは自動的に推論されます。
これにより、データから推論されたスキーマを使用して空のテーブルが作成されます。 DESCRIBE TABLE コマンドを使うと、これらの型がどのように割り当てられたかを確認できます。
Query
Response
このテーブルにデータを挿入するには、INSERT INTO, SELECT コマンドを使用します。 url 関数と組み合わせると、データは URL から直接ストリーミングされます:
たった1つのコマンドで、2,800万行をClickHouseに正常に挿入できました!
4

データを確認する

以下のクエリを実行して、Hacker News の記事と特定のカラムをサンプルとして表示します。
Query
Response
スキーマ推論は初期段階でデータを調べるには非常に便利な機能ですが、「ベストエフォート」にすぎず、長期的にはデータに最適なスキーマを定義する代わりにはなりません。
5

スキーマを定義する

すぐに効果が見込める最適化として、各フィールドに型を定義することが挙げられます。 time フィールドを DateTime 型として宣言するだけでなく、既存のデータセットを削除したうえで、以下の各フィールドにも適切な型を定義します。 ClickHouse では、データの主キーは ORDER BY 句で定義されます。適切な型を選び、どのカラムを ORDER BY 句に含めるかを決めることで、クエリ速度と圧縮の向上につながります。以下のクエリを実行して、古いスキーマを削除し、改善したスキーマを作成します。
Query
最適化されたスキーマが用意できたので、ローカルファイルシステムからデータを挿入できます。 ここでも clickhouse-client を使用し、INFILE 句と明示的な INSERT INTO を使ってファイル内のデータを挿入します。
Query
6

サンプルクエリを実行する

以下にサンプルクエリをいくつか示します。独自のクエリを作成する際の参考にしてください。

Hacker Newsで「ClickHouse」はどれほど話題になっているか?

scoreフィールドは記事の人気度を示す指標であり、idフィールドと ||連結演算子を使うと元の投稿へのリンクを生成できます。
Query
Response
ClickHouseは時間の経過とともにノイズが増加しているでしょうか?ここでは、time フィールドを DateTime として定義することの有用性がわかります。適切なデータ型を使用することで、toYYYYMM() 関数を活用できます:
Query
Response
「ClickHouse」は時間の経過とともに人気が高まっているようです。

ClickHouse関連記事で最もコメントが多いユーザーは誰ですか?

Query
Response

どのコメントが最も注目を集めているか?

Query
Response

Parquet

ClickHouse の強みの 1 つは、さまざまなフォーマットを扱えることです。 CSV は非常に理想的なユースケースではありますが、データ交換の手段としては最も効率的とはいえません。 次に、効率的な列指向フォーマットである Parquet ファイルからデータを読み込みます。 Parquet の型は最小限に抑えられており、ClickHouse はそれに従う必要があります。この型情報はフォーマット自体にエンコードされています。 Parquet ファイルに対する型推論を行うと、CSV ファイルの場合とはわずかに異なるスキーマになります。
1

データを挿入する

次のクエリを実行して、同じデータを Parquet フォーマットで読み取ります。リモートデータの読み取りには、再び url 関数を使用します。
Parquet の null キースキーマの推論によりカラムが Nullable となるため、このデータセットに null ID が含まれていない場合でも allow_nullable_key が必要です。
推定されたスキーマを表示するには、次のコマンドを実行します。
Query
Response
以降の手順では、authorcomment などのよりわかりやすいカラム名を使用するため、手動で指定したスキーマを使用します。 まず推論されたテーブルを削除し、次にテーブルを作成して、パブリック S3 バケットから直接データを挿入します。
2

検索を高速化するテキスト索引を追加する

“ClickHouse” に言及しているコメント数を確認するには、次のクエリを実行します。
Query
Response
次に、このクエリを高速化するため、commentカラムにtext indexを作成します。テキスト索引では、トークンとそれを含む行を対応付ける転置索引を使用します。 splitByNonAlphaトークナイザーは、英数字以外の文字でテキストを分割します。索引とクエリでは、検索語を小文字にし、lower(comment) を使用するため、大文字と小文字を区別せずに照合されます。クエリ式は、索引付けされた式と一致している必要があります。次のコマンドを実行して索引を作成します。
マテリアライズにより、既存データに対する索引が構築されます。mutations_sync 設定を指定すると、マテリアライズが完了するまで待機します。 索引の定義は system.data_skipping_indices テーブルで確認できます。索引のマテリアライズ後に、同じクエリを再度実行します。
Query
Response
結果は変わりません。索引によって変わるのは、ClickHouseが一致する行を見つける方法であり、どの行が一致するかではないためです。索引を使用した クエリでは処理するデータ量が大幅に減り、はるかに高速に完了します。 EXPLAINを使用して、ClickHouseが索引を適用する予定であることを確認します。
Query
Response
comment_idxエントリは、ClickHouseがテキスト索引を適用する予定であることを示します。この例では、実行プランは3527個の グラニュールのうち547個を選択し、調査するデータ量を大幅に削減します。複数のトークンについて、いずれかまたはすべてを検索することもできます。これらの関数は、索引トークナイザーによって生成された完全なトークンに一致します。 少なくとも1つのトークンが一致する必要がある場合は、hasAnyTokensを使用します。
Query
Response
すべてのトークンが順不同で一致する必要がある場合は、hasAllTokens を使用します。
Query
Response
最終更新日 2026年8月26日