创建您的第一个可互操作表格
重要
使用 Apache XTable™ (Incubating) 将源表同步为不同的目标格式,需要使用一个打包好的 jar 对当前数据集执行同步操作。你可以按照安装页面上的说明来创建此打包 jar。有关更多信息,请阅读 Apache XTable™ 的 GitHub 页面。
在本教程中,我们将介绍如何使用 Apache XTable™ (Incubating) 为不同的表格式之间添加互操作性。例如,你可以将使用 Hudi 摄取的表以 Iceberg 和/或 Delta Lake 表的形式暴露出来,而无需复制或移动该表所使用的底层数据文件,同时保持相似的提交历史以支持正确的时点查询。
前提条件
一个可以运行 Apache Spark 的计算实例。可以是你的本地机器、Docker,也可以是分布式服务,如 Amazon EMR、Google Cloud 的 Dataproc、Azure HDInsight 等
克隆 Apache XTable™ (Incubating) 仓库,并按照安装页面上的步骤创建
xtable-utilities_2.12-0.5.0-SNAPSHOT-bundled.jar可选:设置对以下分布式存储服务的写入和/或读取访问权限:
在本教程中,我们将介绍如何在本地使用 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) 创建可在不同目标表格式中用于查询源表的元数据文件。
后续步骤
- 查看在多个目录中注册你的可互操作表,了解如何使用 Apache XTable™ (Incubating) 在多个目录中自动注册目标表。
- 浏览目录集成指南,了解如何手动将 Apache XTable™ (Incubating) 同步的表注册到不同的数据目录中。
评论
登录后参与评论
KnowForge