跳到主要内容
跳到主要内容

使用 ClickHouse 的 azureBlobStorage 表函数

这是将数据从 Azure Blob Storage 或 Azure Data Lake Storage 复制到 ClickHouse 的最高效且最直接的方法之一。通过此表函数,可以让 ClickHouse 直接连接到 Azure 存储并按需读取数据。

它提供类似表的接口,使可以直接从数据源执行 SELECTINSERT 和过滤操作。该函数经过高度优化,支持许多广泛使用的文件格式,包括 CSVJSONParquetArrowTSVORCAvro 等。完整列表请参见 "Data formats"

在本节中,我们将通过一个从 Azure Blob Storage 向 ClickHouse 传输数据的简单入门示例进行讲解,并介绍高效使用此函数时需要注意的重要事项。有关更多细节和高级选项,请参阅官方文档: azureBlobStorage Table Function 文档页面

获取 Azure Blob Storage 访问密钥

要允许 ClickHouse 访问 Azure Blob Storage,您需要一个包含访问密钥的连接字符串。

  1. 在 Azure 门户中,导航到您的 Storage Account

  2. 在左侧菜单的 Security + networking 部分下选择 Access keys

    Azure Data Store Settings
  3. 选择 key1key2,然后单击 Show 按钮(位于 Connection string 字段旁边)。

    Azure Data Store Access Keys
  4. 复制该连接字符串——您将在 azureBlobStorage 表函数中将其作为参数使用。

从 Azure Blob Storage 查询数据

打开常用的 ClickHouse 查询控制台——可以是 ClickHouse Cloud Web 界面、ClickHouse CLI 客户端,或任何用于运行查询的工具。准备好连接字符串和 ClickHouse 查询控制台之后,就可以开始直接从 Azure Blob Storage 查询数据。

在下面的示例中,我们查询存储在名为 data-container 的容器中、所有 JSON 文件里的数据:

SELECT * FROM azureBlobStorage(
    '<YOUR CONNECTION STRING>',
    'data-container',
    '*.json',
    'JSONEachRow');

如果您想将这些数据复制到本地 ClickHouse 表(例如 my_table)中, 可以使用一条 INSERT INTO ... SELECT 语句:

INSERT INTO my_table
SELECT * FROM azureBlobStorage(
    '<YOUR CONNECTION STRING>',
    'data-container',
    '*.json',
    'JSONEachRow');

这使得可以高效地将外部数据导入 ClickHouse,而无需经过中间的 ETL 步骤。

使用 Environmental Sensors 数据集的简单示例

作为示例,我们将从 Environmental Sensors 数据集中下载一个文件。

  1. Environmental Sensors 数据集
    下载一个示例文件

  2. 在 Azure 门户中创建一个新的存储账户(如果尚未创建)。

注意

请确保已为存储账户启用 Allow storage account key access,否则将无法使用账户密钥访问数据。

  1. 在存储账户中创建一个新的容器。在本示例中,我们将其命名为 sensors。 如果您使用的是现有容器,则可以跳过此步骤。

  2. 将之前下载的 2019-06_bmp180.csv.zst 文件上传到该容器。

  3. 按照前文描述的步骤获取 Azure Blob Storage 连接字符串。

现在一切就绪,您可以直接从 Azure Blob Storage 查询数据:

SELECT *
FROM azureBlobStorage(
    '<YOUR CONNECTION STRING>', 
    'sensors',
    '2019-06_bmp180.csv.zst', 
    'CSVWithNames')
LIMIT 10
SETTINGS format_csv_delimiter = ';'
  1. 要将数据加载到表中,请创建原始数据集所使用 schema 的简化版本:
    CREATE TABLE sensors
    (
        sensor_id UInt16,
        lat Float32,
        lon Float32,
        timestamp DateTime,
        temperature Float32
    )
    ENGINE = MergeTree
    ORDER BY (timestamp, sensor_id);
    
参考资料

有关在查询 Azure Blob Storage 等外部数据源时的配置选项和 schema 推断的更多信息,请参阅从输入数据自动推断 schema

  1. 现在将 Azure Blob Storage 中的数据插入到 sensors 表中:
    INSERT INTO sensors
    SELECT sensor_id, lat, lon, timestamp, temperature
    FROM azureBlobStorage(
        '<YOUR CONNECTION STRING>', 
        'sensors',
        '2019-06_bmp180.csv.zst', 
        'CSVWithNames')
    SETTINGS format_csv_delimiter = ';'
    

存储在 Azure Blob Storage 中的 2019-06_bmp180.csv.zst 文件数据现已写入 sensors 表。

其他资源

这只是对 azureBlobStorage 函数的基本介绍。要了解更高级的选项和配置细节,请参阅官方文档: