Hacker Newsデータセット
このチュートリアルでは、28百万行のHacker Newsデータを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から直接ストリーミングされます。
これで、1つのコマンドで28百万行をClickHouseに成功裏に挿入しました!
データを探索する
以下のクエリを実行して、Hacker Newsのストーリーおよび特定のカラムをサンプリングします。
スキーマ推測は初期データ探索のための優れたツールですが、それは「最善の努力」であり、データの最適スキーマを定義するための長期的な代替品ではありません。
スキーマを定義する
明らかな最初の最適化は、各フィールドのタイプを定義することです。時間フィールドをDateTime
型として宣言するだけでなく、次のフィールドに適切なタイプを定義します。ClickHouseでは、データの主キーidはORDER BY
句を介して定義されます。
適切なタイプを選択し、ORDER BY
句に含めるカラムを選択することは、クエリの速度と圧縮を改善するのに役立ちます。
古いスキーマを削除し、改善されたスキーマを作成する以下のクエリを実行します。
最適化されたスキーマを持つことで、ローカルファイルシステムからデータを今すぐ挿入できます。再びclickhouse-client
を使用して、明示的なINSERT INTO
を使用してファイルを挿入します。
サンプルクエリを実行する
以下にいくつかのサンプルクエリを示し、独自のクエリを作成するためのインスピレーションを提供します。
Hacker Newsでの「ClickHouse」トピックの広がりはどのくらいか?
スコアフィールドはストーリーの人気を測る指標を提供し、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倍改善した理由を理解できます。
インデックスがクエリの高速化のために大規模なグラニュールのスキップを可能にしたことに注意してください。
さらに、一つまたは複数の用語を効率的に検索することも可能です。