You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure SQL视图迁移至Delta表:Spark SQL适配Numeric(12,0)数据类型方案

处理SQL Server NUMERIC(12,0)到Spark SQL的类型映射

核心结论

SQL Server的NUMERIC(12,0)与Spark SQL的DECIMAL(12,0)完全等价——Spark中NUMERIC是DECIMAL的别名,默认自动映射逻辑是符合预期的。如果需要在迁移流程中主动管控类型,可参考以下几种Spark侧的处理方式:


1. 读取Azure SQL数据时强制指定类型

在通过Spark读取Azure SQL视图时,可通过自定义Schema直接指定目标列类型,避免自动映射的不确定性:

// Scala示例
import org.apache.spark.sql.types.{StructType, StructField, DecimalType, StringType}

val customSchema = new StructType()
  .add("target_column", DecimalType(12, 0))
  .add("other_column", StringType)

val df = spark.read
  .format("jdbc")
  .option("url", "jdbc:sqlserver://<your-server>.database.windows.net:1433;database=<your-db>")
  .option("dbtable", "<your-view-name>")
  .option("user", "<username>")
  .option("password", "<password>")
  .schema(customSchema)
  .load()
# Python示例
from pyspark.sql.types import StructType, StructField, DecimalType, StringType

custom_schema = StructType([
    StructField("target_column", DecimalType(12, 0)),
    StructField("other_column", StringType())
])

df = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:sqlserver://<your-server>.database.windows.net:1433;database=<your-db>") \
    .option("dbtable", "<your-view-name>") \
    .option("user", "<username>") \
    .option("password", "<password>") \
    .schema(custom_schema) \
    .load()

2. 写入Delta表时显式定义Schema

通过Spark SQL直接创建Delta表并指定类型,确保与源端类型严格对齐:

CREATE TABLE IF NOT EXISTS unity_catalog.<catalog>.<schema>.<target-table> (
  target_column DECIMAL(12, 0),
  other_column STRING
) USING DELTA
LOCATION '<delta-table-storage-path>'

如果是通过DataFrame写入,可配合mergeSchema参数确保类型匹配:

// Scala写入示例
df.write
  .format("delta")
  .mode("overwrite")
  .option("mergeSchema", "true")
  .saveAsTable("unity_catalog.<catalog>.<schema>.<target-table>")

3. 转换现有列的类型

如果DataFrame中列类型不符合预期,可通过cast函数主动转换为DECIMAL(12,0):

-- Spark SQL转换示例
SELECT 
  CAST(target_column AS DECIMAL(12, 0)) AS target_column,
  other_column
FROM <source-table-or-temp-view>
# Python DataFrame转换示例
from pyspark.sql.functions import col

df_transformed = df.withColumn("target_column", col("target_column").cast(DecimalType(12, 0)))

4. Unity Catalog元数据管控

在Unity Catalog中创建表时,直接显式声明DECIMAL(12,0)类型并添加注释,确保元数据与源端一致:

CREATE TABLE unity_catalog.<catalog>.<schema>.<target-table> (
  transaction_id DECIMAL(12, 0) COMMENT "对应SQL Server NUMERIC(12,0)",
  transaction_date TIMESTAMP,
  amount DOUBLE
) USING DELTA

内容的提问来源于stack exchange,提问作者Developer Rajinikanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:42:38