6.6 KiB
slug | sidebar_position | sidebar_label |
---|---|---|
/ja/engines/table-engines/special/url | 80 | URL |
URLテーブルエンジン
リモートHTTP/HTTPSサーバーとの間でデータをクエリします。このエンジンは、Fileエンジンと似ています。
構文: URL(URL [,Format] [,CompressionMethod])
-
URL
パラメータは、Uniform Resource Locatorの構造に従う必要があります。指定されたURLはHTTPまたはHTTPSを使用するサーバーを指している必要があります。サーバーから応答を得るために追加のヘッダーは必要ありません。 -
Format
は、ClickHouseがSELECT
クエリで使用でき、必要に応じてINSERT
でも使用できる形式である必要があります。サポートされている形式の全リストについては、Formatsを参照してください。この引数が指定されていない場合、ClickHouseは
URL
パラメータのサフィックスから自動的に形式を検出します。URL
パラメータのサフィックスがサポートされている形式と一致しない場合、テーブルの作成に失敗します。例えば、エンジンの式URL('http://localhost/test.json')
では、JSON
形式が適用されます。 -
CompressionMethod
は、HTTPボディを圧縮するかどうかを示します。圧縮が有効になっている場合、URLエンジンによって送信されるHTTPパケットには、使用される圧縮方式を示す'Content-Encoding'ヘッダーが含まれます。
圧縮を有効にするには、まずURL
パラメータで示されるリモートHTTPエンドポイントが対応する圧縮アルゴリズムをサポートしていることを確認してください。
サポートされているCompressionMethod
は以下のいずれかです:
- gzip または gz
- deflate
- brotli または br
- lzma または xz
- zstd または zst
- lz4
- bz2
- snappy
- none
- auto
CompressionMethod
が指定されていない場合、デフォルトではauto
になります。これは、ClickHouseがURL
パラメータのサフィックスから自動的に圧縮方式を検出することを意味します。サフィックスが上記の圧縮方式のいずれかと一致する場合、対応する圧縮が適用され、そうでない場合は圧縮は適用されません。
例えば、エンジンの式URL('http://localhost/test.gzip')
では、gzip
圧縮方式が適用されますが、URL('http://localhost/test.fr')
では、サフィックスfr
が上記の圧縮方式に一致しないため、圧縮は有効化されません。
使用例
INSERT
およびSELECT
クエリはそれぞれPOST
およびGET
リクエストに変換されます。POST
リクエストを処理するには、リモートサーバーがチャンク転送エンコーディングをサポートしている必要があります。
HTTP GETリダイレクトホップの最大数を制限するには、max_http_get_redirects設定を使用できます。
例
1. サーバー上でurl_engine_table
テーブルを作成します:
CREATE TABLE url_engine_table (word String, value UInt64)
ENGINE=URL('http://127.0.0.1:12345/', CSV)
2. 標準のPython 3ツールを使用して基本的なHTTPサーバーを作成し、起動します:
from http.server import BaseHTTPRequestHandler, HTTPServer
class CSVHTTPServer(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/csv')
self.end_headers()
self.wfile.write(bytes('Hello,1\nWorld,2\n', "utf-8"))
if __name__ == "__main__":
server_address = ('127.0.0.1', 12345)
HTTPServer(server_address, CSVHTTPServer).serve_forever()
$ python3 server.py
3. データをリクエストします:
SELECT * FROM url_engine_table
┌─word──┬─value─┐
│ Hello │ 1 │
│ World │ 2 │
└───────┴───────┘
実装の詳細
- 読み取りと書き込みは並行して行うことができます
- サポートされていない機能:
ALTER
およびSELECT...SAMPLE
操作。- インデックス。
- レプリケーション。
PARTITION BY
PARTITION BY
— 任意です。パーティションキーに基づいてデータを分割して、別々のファイルを作成することができます。ほとんどの場合、パーティションキーは不要であり、必要な場合でも一般的に月ごと以上に細かいパーティションキーは不要です。パーティション分割はクエリを高速化しません(ORDER BY式とは対照的です)。過度に細かいパーティション分割は避けてください。クライアントの識別子や名前でデータをパーティション分割しないでください(代わりに、クライアント識別子や名前をORDER BY式の最初のカラムにしてください)。
月ごとにパーティション分割するには、toYYYYMM(date_column)
式を使用します。ここでdate_column
はDate型の日付を持つカラムです。パーティション名は"YYYYMM"
形式になります。
仮想カラム
_path
—URL
へのパスです。型:LowCardinalty(String)
。_file
—URL
のリソース名です。型:LowCardinalty(String)
。_size
— リソースのバイト単位のサイズです。型:Nullable(UInt64)
。サイズが不明な場合、値はNULL
です。_time
— ファイルの最終更新時間です。型:Nullable(DateTime)
。時間が不明な場合、値はNULL
です。_headers
- HTTP応答ヘッダーです。型:Map(LowCardinality(String), LowCardinality(String))
。
ストレージ設定
- engine_url_skip_empty_files - 読み込み時に空のファイルをスキップすることを許可します。デフォルトでは無効です。
- enable_url_encoding - URIのパスのデコード/エンコードを有効/無効にすることを許可します。デフォルトで有効です。