Hudi基础 -- Spark SQL DDL

本文介绍了如何在Spark中使用Hudi创建不同类型的表,包括cow类型的无主键表和有主键表,以及mor类型并设置主键更新的表。此外,还展示了如何创建分区表以及通过CTAS创建非分区和分区主键表。
关键参数:
参数名称
描述
可选项:默认值
primaryKey
表的主键名称,组合主键使用逗号分隔;
(Optional) :  id
type
表类型:cow’ 或 ‘mor’,默认是cow;
(Optional) :  cow
preCombineField
当数据的主键相同时,会根据这个字段判断是否要更新此主键的数据。 不指定默认保留 最新 ;
(Optional) :  ts

1.创建一个cow类型的表

-- create a non-primary key table
create table if not exists hudi_table2(
  id int,
  name string,
  price double
) using hudi
options (
  type = 'cow'
);

2.创建一个cow类型,主键为ID的表

-- create a managed cow table
create table if not exists hudi_table0 (
  id int,
  name string,
  price double
) using hudi
options (
  type = 'cow',
  primaryKey = 'id'
);

3.创建mor类型主键更新的表

create table if not exists hudi_table1 (
  id int,
  name string,
  price double,
  ts bigint
) using hudi
options (
  type = 'mor',
  primaryKey = 'id,name',
  preCombineField = 'ts'
);

4. 创建分区表

create table if not exists hudi_table_p0 (
id bigint,
name string,
dt string,
hh string  
) using hudi
options (
  type = 'cow',
  primaryKey = 'id',
  preCombineField = 'ts'
)
partitioned by (dt, hh);

5.CTAS(Create table as select) 创建表

Hudi支持 CTAS(Create table as select)的方式创建表

5.1 CTAS创建非分区表

create table h3 using hudi
as
select 1 as id, 'a1' as name, 10 as price;

5.2 CTAS创建分区、主键表

create table h2 using hudi
options (type = 'cow', primaryKey = 'id')
partitioned by (dt)
as
select 1 as id, 'a1' as name, 10 as price, 1000 as dt;
更多的 ddl 参考 SQL DDL | Apache Hudi
### 如何在 Spark 中创建 Hudi 表 要在 Spark 中创建 Hudi 表,可以通过以下方式实现。以下是具体的操作方法以及需要注意的关键点: #### 1. 配置环境 为了支持 Hudi 的功能,在启动 `spark-shell` 或者提交 Spark 应用程序之前,需要加载必要的依赖项并设置相应的配置参数。 ```bash ./bin/spark-shell \ --master local[*] \ --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \ --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension' \ --conf 'spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog' ``` 如果使用的是 YARN 模式,则可以调整 `--master` 参数为 `yarn`[^2]。 #### 2. 创建 HudiHudi 支持多种存储模式(COPY_ON_WRITE 和 MERGE_ON_READ),下面分别介绍如何基于这两种模式创建表。 ##### (a) COPY_ON_WRITE 模式的建表语句 以下是一个典型的 DDL 建表语句,用于定义一个 COW 类型的 Hudi 表: ```sql CREATE TABLE hudi_cow_table ( id BIGINT, name STRING, price DOUBLE, ts TIMESTAMP, dt STRING ) USING hudi OPTIONS ( type='cow', primaryKey='id', preCombineField='ts' ) PARTITIONED BY (dt); ``` 此语句中的关键选项解释如下: - `type='cow'`: 定义该表采用 Copy-On-Write 存储模型。 - `primaryKey='id'`: 设置主键字段,用于唯一标识每条记录。 - `preCombineField='ts'`: 当存在重复数据时,指定哪个时间戳字段作为最新的依据。 - `PARTITIONED BY (dt)`: 将数据按日期分区存储,便于查询优化[^1]。 ##### (b) MERGE_ON_READ 模式的建表语句 MERGE_ON_READ 是另一种常见的存储模式,适用于频繁更新和增量处理场景。其建表语法类似于 COW,只需更改类型即可: ```sql CREATE TABLE hudi_mor_table ( id BIGINT, name STRING, price DOUBLE, ts TIMESTAMP, dt STRING ) USING hudi OPTIONS ( type='mor', -- 使用 Merge-on-Read 模式 primaryKey='id', preCombineField='ts' ) PARTITIONED BY (dt); ``` 同样地,也可以通过编程接口动态构建 Schema 并写入数据至 Hudi 表中。例如: ```scala import org.apache.spark.sql.SaveMode val df = spark.read.format("csv").option("header", "true").load("/path/to/data.csv") df.write.format("hudi"). options(Map( "hoodie.datasource.write.table.type" -> "COPY_ON_WRITE", "hoodie.datasource.write.precombine.field" -> "ts", "hoodie.datasource.write.recordkey.field" -> "id", "hoodie.datasource.write.partitionpath.field" -> "dt" )). mode(SaveMode.Append).save("/path/to/hudi/table") ``` 这段代码展示了如何利用 DataFrame API 向已存在的 Hudi 表追加新数据[^3]。 #### 3. 解决常见问题 当尝试创建 Hudi 表遇到异常时,可能是因为缺少某些 JAR 文件或未正确注册扩展类。此时可以根据错误提示定位原因,并采取相应措施解决。比如缺失 `HoodieParquetRealtimeInputFormat` 类的情况,需确认是否已经将 `hudi-hadoop-mr-bundle-x.y.z.jar` 添加到了 Hive Metastore 所使用的库路径下[^3]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值