dbt create table branch 问题
属于社区有人的一个提问,实际上dremio 支持对于nessie source 特定branch 的 table 的创建,而且源码也有信息,只是官方文档缺少说明
branch创建表参考测试
- 一个简单sql
CREATE table dbtv4.myappv5 AT BRANCH prod as select * from pg.public.sensor
- 内部解析处理
<CREATE> { pos = getPos(); }
<TABLE>
[ <IF> <NOT> <EXISTS> { ifNotExists = true; } ]
tblName = CompoundIdentifier()
[ fieldList = TableElementListWithMasking() ]
[ sqlTableVersionSpec = WriteableAtVersionSpec() ]
(
(
<STRIPED> {
partitionDistributionStrategy = PartitionDistributionStrategy.STRIPED;
}
|
WriteableAtVersionSpec
SqlTableVersionSpec WriteableAtVersionSpec() :
{
SqlParserPos pos;
SqlIdentifier simpleId;
TableVersionType tableVersionType = TableVersionType.NOT_SPECIFIED;
SqlNode specifier = SqlLiteral.createCharString("NOT_SPECIFIED",SqlParserPos.ZERO);
}
{
<AT> { pos = getPos(); }
(
<BRANCH> simpleId = SimpleIdentifier()
{
tableVersionType = TableVersionType.BRANCH;
specifier = SqlLiteral.createCharString(simpleId.toString(), simpleId.getParserPosition());
}
|
(<REF> | <REFERENCE>) simpleId = SimpleIdentifier()
{
tableVersionType = TableVersionType.REFERENCE;
specifier = SqlLiteral.createCharString(simpleId.toString(), simpleId.getParserPosition());
}
)
{
return new SqlTableVersionSpec(pos, tableVersionType, specifier, null);
}
}
dbt dremio 支持的解决方法
因为默认是基于create_table_as 这个macro 处理的,如果不支持就需要自己扩展了,方法很多,一种是修改官方的dbt dremio adapter ,还有就是开发自己的dbt pacakge 重写一个dremio__create_table_as
的macro 支持branch, 之后可以结合dispatch 能力使用自己开发的
说明
以上是一个简单说明,后边可以实现一个示例,方便使用,核心是使用好dbt 提供的能力进行扩展
参考资料
https://docs.getdbt.com/reference/dbt-jinja-functions/dispatch
https://docs.dremio.com/current/reference/sql/commands/apache-iceberg-tables/apache-iceberg-create