使用Spark-MSSQL连接器时PySpark与SQL Server数据类型映射及配置问询
Spark SQL Server连接器(1.3.0版本)数据类型映射与Schema配置
一、默认PySpark到SQL Server的数据类型映射
以下是com.microsoft.azure:spark-mssql-connector_2.12:1.3.0连接器执行df.write()时,默认的类型转换规则:
| PySpark 数据类型 | SQL Server 对应数据类型 |
|---|---|
ByteType | TINYINT |
ShortType | SMALLINT |
IntegerType | INT |
LongType | BIGINT |
FloatType | REAL |
DoubleType | FLOAT(53) |
DecimalType(precision, scale) | DECIMAL(precision, scale) |
StringType | VARCHAR(MAX) |
BinaryType | VARBINARY(MAX) |
BooleanType | BIT |
DateType | DATE |
TimestampType | DATETIME2 |
ArrayType/MapType/StructType | 无默认映射(需手动转换为JSON字符串或拆分存储) |
二、createTableColumnTypes选项的正确使用
createTableColumnTypes选项直接指定的是SQL Server的列数据类型(而非Spark类型),格式需符合SQL Server的CREATE TABLE列定义语法。比如:
df.write \ .format("com.microsoft.sqlserver.jdbc.spark") \ .option("url", "jdbc:sqlserver://...") \ .option("dbtable", "target_table") \ .option("createTableColumnTypes", "name CHAR(64), age INT, description VARCHAR(1024)") \ .mode("overwrite") \ .save()
这里的CHAR(64)、INT都是SQL Server的类型,只要这些类型和DataFrame中对应列的Spark类型兼容即可(比如name列是Spark的StringType,对应SQL Server的CHAR(64)是兼容的)。
三、直接指定目标Schema的方法
可以通过以下两种方式直接控制目标表的Schema:
- 预先在SQL Server创建表:先手动在SQL Server中定义好目标表的完整Schema,然后用
append或overwrite模式写入DataFrame,连接器会自动匹配列名进行写入。 - 通过
createTableColumnTypes完整定义:把目标表所有列的SQL Server类型都在createTableColumnTypes中指定,相当于在创建表时直接定义了完整Schema,比如:
.option("createTableColumnTypes", "id INT PRIMARY KEY, username VARCHAR(50), register_date DATE, score DECIMAL(5,2)")
内容的提问来源于stack exchange,提问作者Rob G.
相关产品推荐
相关产品推荐

