このチュートリアルでは、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
スキーマ推論を使ってデータをロードする
データのロードに最も簡単で強力なツールは、これにより、データから推論されたスキーマを使用して空のテーブルが作成されます。
このテーブルにデータを挿入するには、たった1つのコマンドで、2,800万行をClickHouseに正常に挿入できました!
clickhouse-client です。これは、多機能なネイティブのコマンドラインクライアントです。
データをロードする際は、再度スキーマ推論を活用し、ClickHouse にカラムの型の判定を任せることができます。以下のコマンドを実行すると、url 関数を使ってリモートの CSV ファイルの内容にアクセスし、テーブルを作成してデータを直接挿入できます。
スキーマは自動的に推論されます。DESCRIBE TABLE コマンドを使うと、これらの型がどのように割り当てられたかを確認できます。Query
Response
INSERT INTO, SELECT コマンドを使用します。
url 関数と組み合わせると、データは URL から直接ストリーミングされます:4
データを確認する
以下のクエリを実行して、Hacker News の記事と特定のカラムをサンプルとして表示します。スキーマ推論は初期段階でデータを調べるには非常に便利な機能ですが、「ベストエフォート」にすぎず、長期的にはデータに最適なスキーマを定義する代わりにはなりません。
Query
Response
5
スキーマを定義する
すぐに効果が見込める最適化として、各フィールドに型を定義することが挙げられます。
time フィールドを 最適化されたスキーマが用意できたので、ローカルファイルシステムからデータを挿入できます。
ここでも
DateTime 型として宣言するだけでなく、既存のデータセットを削除したうえで、以下の各フィールドにも適切な型を定義します。
ClickHouse では、データの主キーは ORDER BY 句で定義されます。適切な型を選び、どのカラムを ORDER BY
句に含めるかを決めることで、クエリ速度と圧縮の向上につながります。以下のクエリを実行して、古いスキーマを削除し、改善したスキーマを作成します。Query
clickhouse-client を使用し、INFILE 句と明示的な INSERT INTO を使ってファイル内のデータを挿入します。Query
6
サンプルクエリを実行する
以下にサンプルクエリをいくつか示します。独自のクエリを作成する際の参考にしてください。ClickHouseは時間の経過とともにノイズが増加しているでしょうか?ここでは、「ClickHouse」は時間の経過とともに人気が高まっているようです。
Hacker Newsで「ClickHouse」はどれほど話題になっているか?
scoreフィールドは記事の人気度を示す指標であり、idフィールドと ||連結演算子を使うと元の投稿へのリンクを生成できます。Query
Response
time フィールドを DateTime として定義することの有用性がわかります。適切なデータ型を使用することで、toYYYYMM() 関数を活用できます:Query
Response
ClickHouse関連記事で最もコメントが多いユーザーは誰ですか?
Query
Response
どのコメントが最も注目を集めているか?
Query
Response
Parquet
1
データを挿入する
次のクエリを実行して、同じデータを Parquet フォーマットで読み取ります。リモートデータの読み取りには、再び 推定されたスキーマを表示するには、次のコマンドを実行します。以降の手順では、
url 関数を使用します。Parquet の null キースキーマの推論によりカラムが
Nullable となるため、このデータセットに
null ID が含まれていない場合でも allow_nullable_key が必要です。Query
Response
author や comment などのよりわかりやすいカラム名を使用するため、手動で指定したスキーマを使用します。
まず推論されたテーブルを削除し、次にテーブルを作成して、パブリック S3 バケットから直接データを挿入します。2
検索を高速化するテキスト索引を追加する
“ClickHouse” に言及しているコメント数を確認するには、次のクエリを実行します。次に、このクエリを高速化するため、マテリアライズにより、既存データに対する索引が構築されます。結果は変わりません。索引によって変わるのは、ClickHouseが一致する行を見つける方法であり、どの行が一致するかではないためです。索引を使用した
クエリでは処理するデータ量が大幅に減り、はるかに高速に完了します。
すべてのトークンが順不同で一致する必要がある場合は、
Query
Response
commentカラムにtext indexを作成します。テキスト索引では、トークンとそれを含む行を対応付ける転置索引を使用します。
splitByNonAlphaトークナイザーは、英数字以外の文字でテキストを分割します。索引とクエリでは、検索語を小文字にし、lower(comment)
を使用するため、大文字と小文字を区別せずに照合されます。クエリ式は、索引付けされた式と一致している必要があります。次のコマンドを実行して索引を作成します。mutations_sync 設定を指定すると、マテリアライズが完了するまで待機します。
索引の定義は system.data_skipping_indices テーブルで確認できます。索引のマテリアライズ後に、同じクエリを再度実行します。Query
Response
EXPLAINを使用して、ClickHouseが索引を適用する予定であることを確認します。Query
Response
comment_idxエントリは、ClickHouseがテキスト索引を適用する予定であることを示します。この例では、実行プランは3527個の
グラニュールのうち547個を選択し、調査するデータ量を大幅に削減します。複数のトークンについて、いずれかまたはすべてを検索することもできます。これらの関数は、索引トークナイザーによって生成された完全なトークンに一致します。
少なくとも1つのトークンが一致する必要がある場合は、hasAnyTokensを使用します。Query
Response
hasAllTokens を使用します。Query
Response