PolyBase 的类型映射

适用于: SQL Server(仅限 Windows)Not supported. Azure SQL 数据库 Not supported. Azure Synapse Analytics Not supported. Analytics Platform System (PDW)

本文介绍 PolyBase 外部数据源与 SQL Server 之间的映射。 可以使用此信息通过 CREATE EXTERNAL TABLE Transact-SQL 命令正确定义外部表。

概述

使用 PolyBase 创建外部表时,列定义(包括数据类型和列数)必须与外部文件中的数据匹配。 如果存在不匹配,则查询实际数据时会拒绝文件行。

对于引用外部数据源中的文件的外部表,列和类型定义必须映射到外部文件的确切架构。 定义引用 Hadoop/Hive 中存储的数据的数据类型时,可在 SQL 与 Hive 数据类型之间使用以下映射,并在从中进行选择时将类型强制转换为 SQL 数据类型。 除非另有说明,否则类型包括 Hive 的所有版本。

注意

在任何转换中,SQL Server 都不支持 Hive 无穷大数据值。 PolyBase 会失败,并出现数据类型转换错误。

Hadoop 类型映射引用

SQL 数据类型 .NET 数据类型 Hive 数据类型 Hadoop/Java 数据类型1 注释
tinyint Byte tinyint ByteWritable 仅用于无符号数字。
smallint Int16 smallint ShortWritable
int Int32 int IntWritable
bigint Int64 bigint LongWritable
bit 布尔 boolean BooleanWritable
FLOAT Double double DoubleWritable
real Single FLOAT FloatWritable
money 十进制 double DoubleWritable
smallmoney 十进制 double DoubleWritable
nchar String

Char[]
string Varchar
nvarchar String

Char[]
string Varchar
char String

Char[]
string Varchar
varchar String

Char[]
string Varchar
binary Byte[] binary BytesWritable 适用于 Hive 0.8 及更高版本。
varbinary Byte[] binary BytesWritable 适用于 Hive 0.8 及更高版本。
date DateTime timestamp TimestampWritable
smalldatetime DateTime timestamp TimestampWritable
datetime2 DateTime timestamp TimestampWritable
datetime DateTime timestamp TimestampWritable
时间 TimeSpan timestamp TimestampWritable
decimal 小数 decimal BigDecimalWritable 适用于 Hive 0.11 及更高版本。

1 从 SQL Server 2022 (16.x) 开始,Hadoop 不再受支持。

Parquet 和 Delta 类型映射参考

下面列出了映射到 SQL Server 数据类型的 Parquet 和 Delta 外部表格类型。

Parquet 文件和 Delta Lake 文件包含每一列的类型说明。 下表介绍了如何将 Parquet 类型映射到 SQL 本机类型。

Parquet 类型 Parquet 逻辑类型(批注) SQL 数据类型
BOOLEAN bit
BINARY/BYTE_ARRAY varbinary
DOUBLE FLOAT
FLOAT real
INT32 int
INT64 bigint
INT96 datetime2
FIXED_LEN_BYTE_ARRAY binary
BINARY UTF8 varchar *(UTF8 collation)
BINARY STRING varchar *(UTF8 collation)
BINARY ENUM varchar *(UTF8 collation)
FIXED_LEN_BYTE_ARRAY UUID uniqueidentifier
BINARY DECIMAL Decimal
BINARY JSON varchar(8000) *(UTF8 排序规则)
BINARY BSON 不支持
FIXED_LEN_BYTE_ARRAY DECIMAL Decimal
BYTE_ARRAY INTERVAL 不支持
INT32 INT(8, true) smallint
INT32 INT(16, true) smallint
INT32 INT(32, true) int
INT32 INT(8, false) tinyint
INT32 INT(16, false) int
INT32 INT(32, false) bigint
INT32 DATE date
INT32 DECIMAL Decimal
INT32 TIME (MILLIS) time
INT64 INT(64, true) bigint
INT64 INT(64, false) decimal(20,0)
INT64 DECIMAL Decimal
INT64 TIME (MICROS) time
INT64 TIME (NANOS) 不支持
INT64 TIMESTAMP(规范化为 utc)(MILLIS / MICROS) datetime2
INT64 TIMESTAMP(不规范化为 utc)(MILLIS / MICROS) bigint - 在将 bigint 值转换为日期/时间值之前,请确保使用时区偏移量显式对其进行调整。
INT64 TIMESTAMP (NANOS) 不支持
复杂类型 列表 varchar(8000),序列化为 JSON
复杂类型 MAP varchar(8000),序列化为 JSON

Oracle 类型映射引用

Oracle 数据类型 SQL Server 类型
浮点 浮点
NUMBER 浮点
NUMBER (p,s) Decimal (p, s)
LONG Nvarchar
BINARY_FLOAT Real
BINARY_DOUBLE 浮点
CHAR Char
VARCHAR2 Varchar
NVARCHAR2 Nvarchar
RAW Varbinary
LONG RAW Varbinary
BLOB Varbinary
CLOB Varchar
NCLOB Nvarchar
ROWID Varchar
UROWID Varchar
DATE Datetime2
TIMESTAMP Datetime2

类型不匹配

Float:Oracle 支持的浮点精度为 126,低于 SQL Server 支持的精度 (53)。 因此,可以直接映射 Float (1-53),但除此之外,截断会导致数据丢失。

时间戳:
Oracle 中的时间戳和具有当地时区的时间戳支持 0.9 秒的精度,而 SQL Server DateTime2 仅支持 0.7 秒的精度。

MongoDB 类型映射

BSON 数据类型 SQL Server 类型
Double 浮点
字符串 Nvarchar
二进制数据 Nvarchar
对象 ID Nvarchar
布尔 bit
日期 Datetime2
32-bit integer int
时间戳 Nvarchar
64 位整数 BigInt
Decimal 128 十进制
DBPointer Nvarchar
JavaScript Nvarchar
Max Key Nvarchar
Min Key Nvarchar
符号 Nvarchar
Regular Expression Nvarchar
Undefined/NULL Nvarchar

MongoDB 使用 BSON 文档来存储数据记录。 与之前的方案不同,BSON 是无架构的,并且支持在其他文档中嵌入文档和数组。 这为用户提供了灵活性。

Teradata 类型映射引用

Teradata 数据类型 SQL Server 类型
INTEGER int
SMALLINT SmallInt
BIGINT BigInt
BYTEINT SmallInt
DECIMAL 小数
FLOAT 十进制
BYTE 二进制
VARBYTE Varbinary
BLOB varbinary
CHAR Nchar
CLOB Nvarchar
VARCHAR Nvarchar
Graphic Nchar
JSON Nvarchar
VARGRAPHIC Nvarchar
DATE 日期
TIMESTAMP Datetime2
TIME 时间
TIME WITH TIME ZONE 时间
TIMESTAMP WITH TIME ZONE 时间

后续步骤

有关如何使用它的更多信息,请参阅 CREATE EXTERNAL TABLE 的 Transact-SQL 参考文章。