在GCP BigQuery的dbt Python模型中配置Spark参数
解决方案:在dbt+Dataproc Spark环境设置Parquet Legacy兼容配置
针对你需要配置的四个Spark Parquet日期/时间兼容参数,以下是三种可行的设置方式:
1. 修正profiles.yml配置(全局生效)
你尝试的server_side_parameters是dbt-spark适配器支持的配置项,但需保证YAML缩进格式正确(YAML对缩进严格要求,建议用2个空格层级)。正确配置格式如下:
analytics_profile: outputs: dev: type: spark method: dataproc # 保留你已有的其他配置(如project_id、cluster名称等) server_side_parameters: "spark.sql.legacy.parquet.int96RebaseModeInRead": "CORRECTED" "spark.sql.legacy.parquet.int96RebaseModeInWrite": "CORRECTED" "spark.sql.legacy.parquet.datetimeRebaseModeInRead": "CORRECTED" "spark.sql.legacy.parquet.datetimeRebaseModeInWrite": "CORRECTED"
修改后重新运行dbt模型,这些参数会自动传递给Dataproc的Spark会话。
2. 在Python模型代码中设置(单模型生效)
如果仅需针对特定Python模型生效,可在模型代码中直接通过SparkSession配置:
def model(dbt, session): # 逐个设置Spark配置参数 session.conf.set("spark.sql.legacy.parquet.int96RebaseModeInRead", "CORRECTED") session.conf.set("spark.sql.legacy.parquet.int96RebaseModeInWrite", "CORRECTED") session.conf.set("spark.sql.legacy.parquet.datetimeRebaseModeInRead", "CORRECTED") session.conf.set("spark.sql.legacy.parquet.datetimeRebaseModeInWrite", "CORRECTED") # 后续模型逻辑 dbt.config(materialized="table") df = session.read.parquet("你的数据源路径") # ... 数据处理、转换逻辑 return df
这种方式灵活性高,仅对当前模型生效,不影响其他dbt模型。
3. Dataproc集群全局配置(所有Spark任务生效)
如果希望集群上所有Spark任务都默认继承这些配置,可在集群层面设置:
- 创建集群时配置:使用gcloud命令添加参数:
gcloud dataproc clusters create 你的集群名 \ --region 你的集群区域 \ --properties spark.sql.legacy.parquet.int96RebaseModeInRead=CORRECTED,spark.sql.legacy.parquet.int96RebaseModeInWrite=CORRECTED,spark.sql.legacy.parquet.datetimeRebaseModeInRead=CORRECTED,spark.sql.legacy.parquet.datetimeRebaseModeInWrite=CORRECTED
- 已有集群修改:进入GCP控制台的Dataproc集群详情页,编辑集群的Spark配置,添加上述四个参数后保存,重启集群即可生效。
你可根据需求选择对应方式:全量模型需配置优先选profiles.yml或集群全局配置;单个模型需配置则用代码设置更合适。
内容的提问来源于stack exchange,提问作者Bo Bucklen
相关产品推荐
相关产品推荐

