Help wanted!

The following content of this documentation page has been machine-translated. But unlike other websites, it is not done on the fly. This translated text lives on GitHub repository alongside main ClickHouse codebase and waits for fellow native speakers to make it more human-readable. You can also use the original English version as a reference.

Help ClickHouse documentation by editing this page

HDFS

该引擎提供了集成 Apache Hadoop 生态系统通过允许管理数据 HDFS通过ClickHouse. 这个引擎是相似的
文件URL 引擎,但提供Hadoop特定的功能。

用途

  1. ENGINE = HDFS(URI, format)

URI 参数是HDFS中的整个文件URI。
format 参数指定一种可用的文件格式。 执行
SELECT 查询时,格式必须支持输入,并执行
INSERT queries – for output. The available formats are listed in the
格式 科。
路径部分 URI 可能包含水珠。 在这种情况下,表将是只读的。

示例:

1. 设置 hdfs_engine_table 表:

  1. CREATE TABLE hdfs_engine_table (name String, value UInt32) ENGINE=HDFS('hdfs://hdfs1:9000/other_storage', 'TSV')

2. 填充文件:

  1. INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3)

3. 查询数据:

  1. SELECT * FROM hdfs_engine_table LIMIT 2
  1. ┌─name─┬─value─┐
  2. one 1
  3. two 2
  4. └──────┴───────┘

实施细节

  • 读取和写入可以并行
  • 不支持:
    • ALTERSELECT...SAMPLE 操作。
    • 索引。
    • 复制。

路径中的水珠

多个路径组件可以具有globs。 对于正在处理的文件应该存在并匹配到整个路径模式。 文件列表确定在 SELECT (不在 CREATE 时刻)。

  • * — Substitutes any number of any characters except / 包括空字符串。
  • ? — Substitutes any single character.
  • {some_string,another_string,yet_another_one} — Substitutes any of strings 'some_string', 'another_string', 'yet_another_one'.
  • {N..M} — Substitutes any number in range from N to M including both borders.

建筑与 {} 类似于 远程 表功能。

示例

  1. 假设我们在HDFS上有几个TSV格式的文件,其中包含以下Uri:
  • ‘hdfs://hdfs1:9000/some_dir/some_file_1’
  • ‘hdfs://hdfs1:9000/some_dir/some_file_2’
  • ‘hdfs://hdfs1:9000/some_dir/some_file_3’
  • ‘hdfs://hdfs1:9000/another_dir/some_file_1’
  • ‘hdfs://hdfs1:9000/another_dir/some_file_2’
  • ‘hdfs://hdfs1:9000/another_dir/some_file_3’
  1. 有几种方法可以创建由所有六个文件组成的表:
  1. CREATE TABLE table_with_range (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_{1..3}', 'TSV')

另一种方式:

  1. CREATE TABLE table_with_question_mark (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_?', 'TSV')

表由两个目录中的所有文件组成(所有文件都应满足query中描述的格式和模式):

  1. CREATE TABLE table_with_asterisk (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/*', 'TSV')

警告

如果文件列表包含带有前导零的数字范围,请单独使用带有大括号的构造或使用 ?.

示例

创建具有名为文件的表 file000, file001, … , file999:

  1. CREARE TABLE big_table (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/big_dir/file{0..9}{0..9}{0..9}', 'CSV')

虚拟列

  • _path — Path to the file.
  • _file — Name of the file.

另请参阅

原始文章