Hacker News データセット
このチュートリアルでは、Hacker News のデータ 2,800 万行を、CSV および Parquet 形式から ClickHouse のテーブルに挿入し、そのデータを探索するための簡単なクエリを実行します。
CSV
データをサンプリングする
clickhouse-localを使用すると、ClickHouseサーバーのデプロイや設定を行うことなく、ローカルファイルに対して高速処理を実行できます。
ClickHouseにデータを保存する前に、clickhouse-localを使用してファイルをサンプリングします。 コンソールから以下を実行します:
次に、以下のコマンドを実行してデータを探索します。
このコマンドには多くの便利な機能があります。
file演算子を使用すると、CSVWithNames形式を指定するだけでローカルディスクからファイルを読み取ることができます。
最も重要な点として、スキーマはファイルの内容から自動的に推論されます。
また、clickhouse-localが拡張子からgzip形式を推論して圧縮ファイルを読み取ることができる点にも注目してください。
Vertical形式は、各カラムのデータをより見やすく表示するために使用されます。
スキーマ推論によるデータの読み込み
データ読み込みに最もシンプルかつ強力なツールはclickhouse-clientです。これは機能豊富なネイティブコマンドラインクライアントです。
データを読み込む際は、スキーマ推論を活用し、ClickHouseにカラムの型を判定させることができます。
以下のコマンドを実行して、テーブルを作成し、リモートCSVファイルから直接データを挿入します。ファイルの内容にはurl関数を使用してアクセスします。
スキーマは自動的に推論されます:
これにより、データから推測されたスキーマを使用して空のテーブルが作成されます。
DESCRIBE TABLE コマンドを使用することで、割り当てられた型を確認できます。
このテーブルにデータを挿入するには、INSERT INTO, SELECTコマンドを使用します。
url関数と組み合わせることで、URLから直接データがストリーミングされます:
単一のコマンドで2800万行をClickHouseに正常に挿入しました!
データを探索する
以下のクエリを実行して、Hacker Newsのストーリーと特定の列をサンプリングします:
スキーマ推論は初期のデータ探索には有用なツールですが、「ベストエフォート」型の機能であり、データに最適なスキーマを定義することの長期的な代替手段にはなりません。
スキーマを定義する
明らかな即時最適化として、各フィールドに型を定義することが挙げられます。
時刻フィールドをDateTime型として宣言することに加えて、既存のデータセットを削除した後、以下の各フィールドに適切な型を定義します。
ClickHouseでは、データのプライマリキーはORDER BY句によって定義されます。
適切なデータ型を選択し、ORDER BY句に含める列を選定することで、クエリ速度と圧縮率を向上させることができます。
以下のクエリを実行して、既存のスキーマを削除し、改善されたスキーマを作成します:
最適化されたスキーマを使用することで、ローカルファイルシステムからデータを挿入できます。
再びclickhouse-clientを使用して、明示的なINSERT INTO文とINFILE句でファイルを挿入します。
サンプルクエリを実行する
以下にサンプルクエリを示します。独自のクエリを記述する際の参考にしてください。
Hacker Newsにおいて「ClickHouse」はどの程度話題になっているか?
scoreフィールドはストーリーの人気度の指標を提供し、idフィールドと||連結演算子を使用して元の投稿へのリンクを生成できます。
ClickHouseは時間の経過とともにより多くのノイズを生成しているでしょうか?ここでは、timeフィールドをDateTimeとして定義することの有用性が示されています。適切なデータ型を使用することで、toYYYYMM()関数を利用できます:
"ClickHouse"の人気が時間とともに高まっているようです。
ClickHouse関連記事のトップコメント投稿者は誰か?
どのコメントが最も関心を集めているか?
Parquet
ClickHouse の強みの 1 つは、任意の数のフォーマットを扱えることです。 CSV は典型的なユースケースを表しますが、データ交換の観点では最も効率的というわけではありません。
次に、効率的なカラム指向フォーマットである Parquet ファイルからデータをロードします。
Parquet には最小限の型しかなく、ClickHouse はそれに準拠する必要があり、この型情報はフォーマット自体にエンコードされています。 Parquet ファイルに対する型推論では、CSV ファイルのスキーマとは必ずわずかに異なるスキーマが得られます。
データを挿入する
以下のクエリを実行して、同じデータをParquet形式で読み取ります。ここでもurl関数を使用してリモートデータを読み取ります:
Parquet形式の仕様上、実際のデータには存在しない場合でも、キーがNULLになる可能性を考慮する必要があります。
推論されたスキーマを表示するには、次のコマンドを実行します:
CSV ファイルの場合と同様に、選択する型をより細かく制御するためにスキーマを手動で指定し、S3 から直接データを挿入できます。
クエリを高速化するスキッピングインデックスの追加
「ClickHouse」に言及しているコメント数を確認するには、以下のクエリを実行します:
次に、このクエリを高速化するために、「comment」列に転置インデックスを作成します。 なお、コメントは小文字に変換されてインデックス化されるため、大文字小文字を区別せずに用語を検索できます。
以下のコマンドを実行してインデックスを作成します。
インデックスのマテリアライゼーションには時間がかかります(インデックスが作成されたかどうかを確認するには、システムテーブル system.data_skipping_indices を使用します)。
インデックスの作成後、クエリを再実行してください:
インデックスを使用することで、クエリの実行時間が0.843秒から0.248秒に短縮されました:
EXPLAIN句を使用して、このインデックスの追加によりクエリのパフォーマンスが約3.4倍向上した理由を確認できます。
インデックスによって大量のグラニュールがスキップされ、クエリが高速化されていることに注目してください。
1つまたは複数の用語すべてを効率的に検索することも可能になりました: