Skip to main content
此连接器利用 ClickHouse 特有的优化能力,例如高级分区和谓词下推,以 提升查询性能和数据处理效率。 该连接器基于 ClickHouse 官方 JDBC connector,并 自行管理其目录。 在 Spark 3.0 之前,Spark 缺少内置的目录概念,因此用户通常依赖 Hive Metastore 或 AWS Glue 等外部目录系统。 使用这些外部方案时,用户必须先手动注册数据源表,然后才能在 Spark 中访问它们。 不过,自 Spark 3.0 引入目录概念后,Spark 现在可以通过注册 目录插件来自动发现表。 Spark 的默认目录是 spark_catalog,表通过 {catalog name}.{database}.{table} 标识。借助这一新的 目录功能,现在可以在单个 Spark 应用中添加并使用多个目录。

在 Catalog API 和 TableProvider API 之间进行选择

ClickHouse Spark connector 支持两种访问方式:Catalog APITableProvider API (基于 format 的访问) 。了解它们之间的差异,有助于你根据具体用例选择更合适的方式。

Catalog API 与 TableProvider API 对比

要求

  • Java 8 或 17 (Spark 4.0 需要 Java 17 及以上版本)
  • Scala 2.12 或 2.13 (Spark 4.0 仅支持 Scala 2.13)
  • Apache Spark 3.3、3.4、3.5 或 4.0

兼容性矩阵

安装与设置

要将 ClickHouse 与 Spark 集成,可根据不同的项目配置选择多种安装方式。 您可以将 ClickHouse Spark connector 直接作为依赖项添加到项目的构建文件中 (例如 Maven 的 pom.xml 或 SBT 的 build.sbt) 。 或者,也可以将所需的 JAR 文件放入 $SPARK_HOME/jars/ 目录中,或在 spark-submit 命令中 使用 --jars 参数将其直接作为 Spark 选项传入。 这两种方式都能确保 ClickHouse 连接器在您的 Spark 环境中可用。

作为依赖导入

要使用 SNAPSHOT 版本,请参阅 Sonatype 的通过 Maven 使用 SNAPSHOT 发行版说明

下载库

二进制 JAR 的命名格式如下:
您可以在 Maven Central Repository 中找到所有已发布的 JAR 文件。 每日构建的 SNAPSHOT JAR 文件可通过上方配置的 Sonatype snapshots 仓库获取。
务必包含带有 “all” classifier 的 clickhouse-jdbc JAR, 因为该连接器 依赖于 clickhouse-httpclickhouse-client——它们都已打包 在 clickhouse-jdbc:all 中。 或者,如果您 不想使用完整的 JDBC 包,也可以分别添加 clickhouse-client JARclickhouse-http无论采用哪种方式,请确保这些包的版本与 兼容性矩阵保持一致。

注册 目录 (必需)

要访问您的 ClickHouse 表,必须使用以下配置新增一个 Spark 目录: 这些设置可通过以下任一方式进行配置:
  • 编辑或创建 spark-defaults.conf
  • 将配置作为参数传递给 spark-submit 命令 (或 spark-shell/spark-sql CLI 命令) 。
  • 在初始化 Context 时添加配置。
使用 ClickHouse cluster 时,您需要为每个 instance 设置唯一的 目录 名称。 例如:
这样,您就可以在 Spark SQL 中通过 clickhouse1.<ck_db>.<ck_table> 访问 clickhouse1 的表 <ck_db>.<ck_table>,并通过 clickhouse2.<ck_db>.<ck_table> 访问 clickhouse2 的表 <ck_db>.<ck_table>

使用 TableProvider API (基于格式的访问)

除了基于 目录 的方法外,ClickHouse Spark connector 还支持通过 TableProvider API 进行基于格式的访问

基于格式的读取示例

基于格式的写入示例

TableProvider 功能

TableProvider API 具备多项强大功能:

自动创建表

当写入一个不存在的表时,连接器会自动使用合适的 schema 创建该表。连接器提供了以下智能默认值:
  • Engine:如果未指定,默认使用 MergeTree()。你可以使用 engine 选项指定其他引擎 (例如 ReplacingMergeTree()SummingMergeTree() 等)
  • ORDER BY必需 - 创建新表时,必须显式指定 order_by 选项。连接器会验证所有指定的列都存在于 schema 中。
  • Nullable Key 支持:如果 ORDER BY 包含 Nullable 列,则会自动添加 settings.allow_nullable_key=1
ORDER BY 必需:通过 TableProvider API 创建新表时,order_by 选项是必需的。你必须显式指定哪些列将用于 ORDER BY 子句。连接器会验证所有指定的列都存在于 schema 中;如果缺少任何列,则会抛出错误。Engine 选择:默认引擎是 MergeTree(),但你可以使用 engine 选项指定任何 ClickHouse 表引擎 (例如 ReplacingMergeTree()SummingMergeTree()AggregatingMergeTree() 等) 。

TableProvider 连接选项

使用基于格式的 API 时,可用以下连接选项:

连接选项

表创建选项

当表不存在且需要创建时,可使用以下选项:
  • 创建新表时,必须提供 order_by 选项。所有指定列都必须存在于 schema 中。 ** 如果 ORDER BY 包含 Nullable 列,且未显式提供此项,则会自动设置为 1
最佳实践:对于 ClickHouse Cloud,如果 ORDER BY 列可能为 Nullable,请显式设置 settings.allow_nullable_key=1,因为 ClickHouse Cloud 要求启用此设置。

写入模式

Spark 连接器 (包括 TableProvider API 和 Catalog API) 支持以下 Spark 写入模式:
  • append:向现有表追加数据
  • overwrite:替换表中的所有数据 (会截断表)
暂不支持分区覆盖:该连接器当前不支持分区级别的覆盖操作 (例如结合 partitionBy 使用 overwrite 模式) 。此功能正在开发中。可参见 GitHub issue #34 跟踪该功能的进展。

配置 ClickHouse 选项

Catalog API 和 TableProvider API 都支持配置 ClickHouse 专用选项 (而不是连接器选项) 。创建表或执行查询时,这些选项会传递给 ClickHouse。 通过 ClickHouse 选项,你可以配置 ClickHouse 特有的设置,例如 allow_nullable_keyindex_granularity 以及其他表级或查询级设置。这些不同于连接器选项 (如 hostdatabasetable) ;后者用于控制连接器如何连接到 ClickHouse。

使用 TableProvider API

使用 TableProvider API 时,请采用 settings.<key> 选项格式:

使用 Catalog API

使用 Catalog API 时,请在 Spark 配置中采用 spark.sql.catalog.<catalog_name>.option.<key> 格式:
或者在通过 Spark SQL 创建表时进行设置:

ClickHouse Cloud 设置

连接到 ClickHouse Cloud 时,请确保已启用 SSL,并设置合适的 SSL 模式。例如:

读取数据

写入数据

暂不支持分区覆盖:Catalog API 目前不支持分区级覆盖操作 (例如使用 partitionByoverwrite 模式) 。该功能正在开发中。有关此功能的进展,请参见 GitHub issue #34

DDL 操作

你可以使用 Spark SQL 在你的 ClickHouse 实例上执行 DDL 操作,所有更改都会立即持久化到 ClickHouse。 Spark SQL 允许你像在 ClickHouse 中一样编写查询, 因此你可以直接执行 CREATE TABLE、TRUNCATE 等命令——无需修改,例如:
使用 Spark SQL 时,一次只能执行一条语句。
上述示例展示了 Spark SQL 查询,你可以在应用程序中使用任意 API——Java、Scala、 PySpark 或 shell——运行这些查询。

使用 VariantType

Spark 4.0+ 已支持 VariantType,且需要使用 ClickHouse 25.3+ 并启用 Experimental JSON/Variant 类型。
该连接器 支持 Spark 的 VariantType,可用于处理半结构化数据。VariantType 会映射到 ClickHouse 的 JSONVariant 类型,让您能够高效存储和查询 schema 灵活的数据。
本节主要介绍 VariantType 的映射和用法。有关所有支持的数据类型的完整概览,请参阅支持的数据类型部分。

ClickHouse 类型映射

读取 VariantType 数据

从 ClickHouse 读取数据时,JSONVariant 列会自动映射到 Spark 的 VariantType

写入 VariantType 数据

你可以使用 JSON 或 Variant 列类型将 VariantType 数据写入 ClickHouse:

使用 Spark SQL DDL 创建 VariantType 表

你可以使用 Spark SQL DDL 来创建 VariantType 表:

配置 Variant 类型

在创建包含 VariantType 列的表时,可以指定使用哪些 ClickHouse 类型:

JSON 类型 (默认)

如果未指定 variant_types 属性,该列默认使用 ClickHouse 的 JSON 类型,而这种类型仅接受 JSON 对象:
这将生成以下 ClickHouse 查询:

含多种类型的 Variant 类型

要支持基本类型、数组和 JSON 对象,请在 variant_types 属性中指定相应类型:
这将生成以下 ClickHouse 查询:

支持的 Variant 类型

以下 ClickHouse 类型可用于 Variant()
  • 基本类型StringInt8Int16Int32Int64UInt8UInt16UInt32UInt64Float32Float64Bool
  • 数组Array(T),其中 T 可以是任何受支持的类型,包括嵌套数组
  • JSON:用于存储 JSON 对象的 JSON

读取格式配置

默认情况下,JSON 和 Variant 列会读取为 VariantType。你可以通过覆盖此行为,将它们读取为字符串:

写入格式支持

VariantType 的写入支持因格式而有所不同: 配置写入格式:
如果需要写入 ClickHouse Variant 类型,请使用 JSON 格式。Arrow 格式仅支持写入 JSON 类型。

最佳实践

  1. 对纯 JSON 数据使用 JSON 类型:如果你只存储 JSON 对象,请使用默认的 JSON 类型 (不要设置 variant_types 属性)
  2. 显式指定类型:使用 Variant() 时,明确列出你计划存储的所有类型
  3. 启用实验性功能:确保 ClickHouse 已启用 allow_experimental_json_type = 1
  4. 写入时使用 JSON 格式:对于 VariantType 数据,建议使用 JSON 格式以获得更好的兼容性
  5. 考虑查询模式:JSON/Variant 类型支持 ClickHouse 的 JSON 路径查询,可实现高效过滤
  6. 使用列提示提升性能:在 ClickHouse 中使用 JSON 字段时,添加列提示可以提升查询性能。目前,尚不支持通过 Spark 添加列提示。请参阅 GitHub issue #497 以跟踪该功能。

示例:完整流程

配置

以下是该连接器中可调整的配置项。
使用配置:这些是同时适用于 Catalog API 和 TableProvider API 的 Spark 级配置选项,可通过以下两种方式设置:
  1. 全局 Spark 配置 (适用于所有操作) :
  2. 按操作覆盖 (仅适用于 TableProvider API,可覆盖全局设置) :
此外,也可以在 spark-defaults.conf 中设置,或在创建 Spark 会话时进行设置。

支持的数据类型

本节介绍 Spark 与 ClickHouse 之间的数据类型映射。下表提供了速查参考, 说明从 ClickHouse 将数据读入 Spark 时,以及将数据从 Spark 插入 ClickHouse 时,数据类型应如何转换。

将数据从 ClickHouse 读取到 Spark

将数据从 Spark 插入到 ClickHouse

贡献与支持

如果您想为该项目作出贡献或报告问题,欢迎向我们反馈! 请访问我们的 GitHub 代码仓库 创建 issue、提出改进建议, 或提交拉取请求。 欢迎贡献!开始之前,请先查看代码仓库中的贡献指南。 感谢您帮助改进我们的 ClickHouse Spark 连接器!
最后修改于 2026年7月24日