このチュートリアルでは、CSV フォーマットと Parquet フォーマットの両方から 2,800 万行の Hacker News データを ClickHouse テーブルに挿入し、簡単なクエリをいくつか実行してデータを確認します。
CSV
データをサンプリングする
clickhouse-local を使うと、ClickHouse server をデプロイして設定しなくても、
ローカルファイルを高速に処理できます。データを ClickHouse に保存する前に、clickhouse-local を使ってファイルをサンプリングしてみましょう。
コンソールから次を実行します。Query
Response
file operator を使うと、CSVWithNames フォーマットを指定するだけで、ローカルディスク上のファイルを読み込めます。
特に重要なのは、ファイルの内容からスキーマが自動的に推論されることです。
また、clickhouse-local は圧縮ファイルも読み込むことができ、拡張子から gzip フォーマットを推論している点にも注目してください。
Vertical フォーマットを使うと、各カラムのデータをより見やすく表示できます。スキーマ推論を使ってデータをロードする
データのロードに最も簡単で強力なツールは、clickhouse-client です。これは、多機能なネイティブのコマンドラインクライアントです。
データをロードする際は、再度スキーマ推論を活用し、ClickHouse にカラムの型の判定を任せることができます。以下のコマンドを実行すると、url 関数を使ってリモートの CSV ファイルの内容にアクセスし、テーブルを作成してデータを直接挿入できます。
スキーマは自動的に推論されます。DESCRIBE TABLE コマンドを使うと、これらの型がどのように割り当てられたかを確認できます。Query
Response
INSERT INTO, SELECT コマンドを使用します。
url 関数と組み合わせると、データは URL から直接ストリーミングされます:データを確認する
以下のクエリを実行して、Hacker News の記事と特定のカラムをサンプルとして表示します。Query
Response
スキーマを定義する
すぐに効果が見込める最適化として、各フィールドに型を定義することが挙げられます。 time フィールドをDateTime 型として宣言するだけでなく、既存のデータセットを削除したうえで、以下の各フィールドにも適切な型を定義します。
ClickHouse では、データの主キーは ORDER BY 句で定義されます。適切な型を選び、どのカラムを ORDER BY
句に含めるかを決めることで、クエリ速度と圧縮の向上につながります。以下のクエリを実行して、古いスキーマを削除し、改善したスキーマを作成します。Query
clickhouse-client を使用し、INFILE 句と明示的な INSERT INTO を使ってファイル内のデータを挿入します。Query
サンプルクエリを実行する
以下にサンプルクエリをいくつか示します。独自のクエリを作成する際の参考にしてください。Hacker Newsで「ClickHouse」はどれほど話題になっているか?
scoreフィールドは記事の人気度を示す指標であり、idフィールドと ||連結演算子を使うと元の投稿へのリンクを生成できます。Query
Response
time フィールドを DateTime として定義することの有用性がわかります。適切なデータ型を使用することで、toYYYYMM() 関数を活用できます:Query
Response
ClickHouse関連記事で最もコメントが多いユーザーは誰ですか?
Query
Response
どのコメントが最も注目を集めているか?
Query
Response
Parquet
データを挿入する
次のクエリを実行し、再度url 関数を使ってリモートデータを読み込み、同じデータを Parquet フォーマットで読み込みます。Parquet における NULL キーParquet フォーマットの仕様上、データ内には存在しない場合でも、
キーが
NULL になり得ることを受け入れる必要があります。Response
クエリを高速化するため、スキップ索引を追加する
“ClickHouse” に言及しているコメントの数を調べるには、次のクエリを実行します。Query
Response
system.data_skipping_indices を使用します) 。索引の作成後に、クエリを再度実行してください:Query
Response
EXPLAIN 句を使うと、この索引を追加することでクエリが約3.4倍高速化された理由を理解できます。Response
Query
Response
Query
Response