考えられるユースケースについて DBT を評価していますが、1 つの状況を除いてすべて問題ないようです。これは、ソース テーブルに構造体フィールドがある場合です。
を使用しています。Spark Thrift Server connector
基になるデータは として保存さparquet
れS3
ます。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 でテストしましたが、問題はないようです