快速开始

创建您的第一个可互操作表格

师成师成· 更新于 2026-09-28· 阅读 9 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

重要

使用 Apache XTable™ (Incubating) 将源表同步为不同的目标格式,需要使用一个打包好的 jar 对当前数据集执行同步操作。你可以按照安装页面上的说明来创建此打包 jar。有关更多信息,请阅读 Apache XTable™ 的 GitHub 页面。

在本教程中,我们将介绍如何使用 Apache XTable™ (Incubating) 为不同的表格式之间添加互操作性。例如,你可以将使用 Hudi 摄取的表以 Iceberg 和/或 Delta Lake 表的形式暴露出来,而无需复制或移动该表所使用的底层数据文件,同时保持相似的提交历史以支持正确的时点查询。

前提条件

  1. 一个可以运行 Apache Spark 的计算实例。可以是你的本地机器、Docker,也可以是分布式服务,如 Amazon EMR、Google Cloud 的 Dataproc、Azure HDInsight 等

  2. 克隆 Apache XTable™ (Incubating) 仓库,并按照安装页面上的步骤创建 xtable-utilities_2.12-0.5.0-SNAPSHOT-bundled.jar

  3. 可选:设置对以下分布式存储服务的写入和/或读取访问权限:

    • Amazon S3:按照此处的步骤安装 AWSCLIv2,并按照此处的步骤设置访问凭证
    • Google Cloud Storage:按照此处的步骤进行操作

在本教程中,我们将介绍如何在本地使用 Apache XTable™ (Incubating)。

步骤

初始化一个 pyspark shell

注意:

你也可以选择使用 spark-sql 或 spark-shell 来跟随本示例。

  • Hudi
  • Delta
  • Iceberg

shell

pyspark \
  --packages org.apache.hudi:hudi-spark3.4-bundle_2.12:1.2.0 \
  --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" \
  --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog" \
  --conf "spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension"

注意:

在本地运行 Spark 时,如果需要写入外部云存储位置(如 Amazon S3、GCS 或 ADLS),可能还需要额外的配置。有关更多信息,请参阅相应云服务商的文档。

创建数据集

在本地写入一张源表。

  • Hudi
  • Delta
  • Iceberg

python

from pyspark.sql.types import *

# initialize the bucket
table_name = "people"
local_base_path = "file:/tmp/hudi-dataset"

records = [
   (1, 'John', 25, 'NYC', '2023-09-28 00:00:00'),
   (2, 'Emily', 30, 'SFO', '2023-09-28 00:00:00'),
   (3, 'Michael', 35, 'ORD', '2023-09-28 00:00:00'),
   (4, 'Andrew', 40, 'NYC', '2023-10-28 00:00:00'),
   (5, 'Bob', 28, 'SEA', '2023-09-23 00:00:00'),
   (6, 'Charlie', 31, 'DFW', '2023-08-29 00:00:00')
]

schema = StructType([
   StructField("id", IntegerType(), True),
   StructField("name", StringType(), True),
   StructField("age", IntegerType(), True),
   StructField("city", StringType(), True),
   StructField("create_ts", StringType(), True)
])

df = spark.createDataFrame(records, schema)

hudi_options = {
   'hoodie.table.name': table_name,
   'hoodie.datasource.write.partitionpath.field': 'city',
   'hoodie.datasource.write.hive_style_partitioning': 'true'
}

(
   df.write
   .format("hudi")
   .options(**hudi_options)
   .save(f"{local_base_path}/{table_name}")
)

运行同步

在克隆的 xtable 目录中创建 my_config.yaml。

  • Hudi
  • Delta
  • Iceberg

yaml

sourceFormat: HUDI
targetFormats:
  - DELTA
  - ICEBERG
datasets:
  -
    tableBasePath: file:///tmp/hudi-dataset/people
    tableName: people
    partitionSpec: city:VALUE

可选: 如果源表位于 Amazon S3、GCS 或 ADLS 中,你应该使用类似如下内容的 yaml 文件。

  • Hudi
  • Delta
  • Iceberg

yaml

sourceFormat: HUDI
targetFormats:
  - DELTA
  - ICEBERG
datasets:
  -
    tableBasePath: s3://path/to/hudi-dataset/people  # replace this with gs://path/to/hudi-dataset/people if your data is in GCS.
    tableName: people
    partitionSpec: city:VALUE

注意:

AWS 的身份验证通过 com.amazonaws.auth.DefaultAWSCredentialsProviderChain 完成。若要覆盖此设置,请使用 --awsCredentialsProvider 选项指定其他实现。

GCP 的身份验证需要导出服务账号凭据,例如:export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service_account_key.json

在已克隆的 Apache XTable™ (Incubating) 目录下打开终端,运行以下命令。

shell

java -jar xtable-utilities/target/xtable-utilities_2.12-0.5.0-SNAPSHOT-bundled.jar --datasetConfig my_config.yaml

可选: 此时,如果你查看本地路径,将能看到必要的元数据文件,其中包含架构、提交历史、分区和列统计信息,这些信息有助于查询引擎在目标表格式中解释数据。

结论

在本教程中,我们学习了如何创建源表,并使用 Apache XTable™ (Incubating) 创建可在不同目标表格式中用于查询源表的元数据文件。

后续步骤

  1. 查看在多个目录中注册你的可互操作表,了解如何使用 Apache XTable™ (Incubating) 在多个目录中自动注册目标表。
  2. 浏览目录集成指南,了解如何手动将 Apache XTable™ (Incubating) 同步的表注册到不同的数据目录中。

评论

登录后参与评论

正在加载评论…