2

考えられるユースケースについて DBT を評価していますが、1 つの状況を除いてすべて問題ないようです。これは、ソース テーブルに構造体フィールドがある場合です。

を使用しています。Spark Thrift Server connector基になるデータは として保存さparquetS3ます。DBT バージョンは 0.20 です

これは、ソース テーブルの作成文の一部です。そこに構造体フィールドがあることがわかります。

CREATE TABLE `<someSchema>`.`<sourceTable>` (
  `properties` STRUCT<`site`: STRING>,
  `channel` STRING,
  `timestamp` STRING,
  `anotherDate` STRING,
  `aDate ` STRING)
  USING parquet
  PARTITIONED BY (aDate)
  LOCATION 's3a://<someBucket>'

私のモデルは、特定の where 句を使用してそのテーブルに対して選択を実行するだけです。初めて実行すると、正常に動作し、元のテーブルとまったく同じテーブルが作成されますが、構造体フィールドであっても、いくつかの小さな変更が加えられています。

これはシンクテーブルの作成テーブルの一部です

CREATE TABLE `<someSchema>`.`dbtsink` (
      `properties` STRUCT<`site`: STRING>,
      `channel` STRING,
      `timestamp` STRING,
      `anotherDate ` STRING,
      `aDate` STRING)
USING parquet
PARTITIONED BY (anotherDate)

where句に他の値を指定してdbtを再度実行すると、シンクテーブルに別のパーティションが作成されるはずです。クエリのコンパイルは問題ありません

次のエラーが発生します。

Runtime Error in model dbtsink (models/anotherDate/dbtsink.sql)
  Database Error
    Error running query: org.apache.spark.sql.AnalysisException: cannot resolve '`site`' given input columns: [dbtsink__dbt_tmp.channel, dbtsink__dbt_tmp.anotherDate, dbtsink__dbt_tmp.aDate, dbtsink__dbt_tmp.properties, dbtsink__dbt_tmp.timestamp]; line 4 pos 25;
    'InsertIntoStatement 'UnresolvedRelation [someSchema, dbtsink], false, false
    +- 'Project [properties#6526, 'site, channel#6527, timestamp#6528, aDate#6541, anotherDate#6540]
       +- SubqueryAlias dbtsink__dbt_tmp
          +- Project [properties#6526, channel#6527, timestamp#6528, anotherDate#6540, aDate#6541]
             +- Filter (((aDate#6541 > 2021060100) AND (aDate#6541 <= 2021070609)) AND (anotherDate#6540 = 2021070609))
                +- SubqueryAlias spark_catalog.someSchema.sourceTable
                   +- Relation[context#6524,traits#6525,properties#6526,channel#6527,timestamp#6528,projectId#6529,integrations#6530,messageId#6531,originalTimestamp#6532,receivedAt#6533,sentAt#6534,userId#6535,anonymousId#6536,type#6537,providerId#6538,version#6539,anotherDate#6540,aDate#6541] parquet

構造体の内部フィールドをルートフィールドとして読み書きしようとしているようです。私は他の構造体フィールドでテストしましたが、最初の実行と同じように、構造体が必要なだけです。私が言ったように、それは2回目の実行でのみ起こります。

これは私のモデルのクエリです。非常に単純です

select 
properties,
channel,
timestamp,
anotherDate,
aDate
from {{ source('someSchema', 'sourceTable') }}
where aDate > '{{ var("aDateLowerLimit") }}' and aDate <= '{{ var("aDateUpperLimit") }}'
and anotherDate = '{{ var("anotherDate") }}'

プロパティを構造体からjsonに変換するように選択を変更するとto_json(properties)、期待どおりに機能し、新しいパーティションが生成されます。

DBT の構造体に何か問題がある場合は? 私は何か間違ったことをしていますか?

私はインクリメンタルマテリアライゼーションを使用しており、append と insert_overwrite でテストしましたが、問題はないようです

4

1 に答える 1