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

posted on 2024-07-20 08:00  荣锋亮  阅读(13)  评论(0编辑  收藏  举报

导航