PolyBase创建外部表查询Hadoop,列数不匹配



我们已经运行了一个polybase服务来查询我们的hadoop集群。下面是我们hadoop端的文件结构:

Structure for/warehouse/tablespace/managed/hive/xxxxxxx/dxxxxxx/created_month=2019-11/base_0000083/bucket_00001文件版本:0.12与ORC_135行:51107ZLIB压缩:压缩大小:262144id: int,xxxxxxxxx

这边有16个字段

在另一边,我创建了一个文件格式如下:
CREATE EXTERNAL FILE FORMAT [OrcFileFormat] WITH (
FORMAT_TYPE = ORC,
DATA_COMPRESSION = N'org.apache.hadoop.io.compress.DefaultCodec')

和外部表如下:

CREATE EXTERNAL TABLE [dbo].[test]
(
id:int,
xxx
xxx
xxx
)
WITH (DATA_SOURCE = [hadoop_test],
LOCATION = N'//warehouse/tablespace/managed/hive/xxxxxxx/dxxxxxx/created_month=2019- 
11/base_0000083/bucket_00001'
,FILE_FORMAT = [OrcFileFormat]
,REJECT_TYPE = VALUE,
REJECT_VALUE = 500)

使用完全复制的字段,唯一的数据类型更改是字符串为varchar和时间戳为datetime。表创建成功;但是,当执行以下查询时:

SELECT TOP (1000) *
FROM [dbo].test

这个错误被抛出:

无法执行查询"远程查询";MSOLEDBSQL"对于链接服务器"(null)"外部文件访问失败,由于内部错误:' file//warehouse/tablespace/managed/hive/xxxxxxx/dxxxxxx/created_month=2019-11/base_0000083/bucket_00001: HdfsBridge::CreateRecordReader -创建记录读取器时遇到意外错误:HadoopExecutionException:列数不匹配。源文件有6列,外部表定义有16列。

有人能帮我一下吗?

当ORC作为事务表创建时发生。在这种情况下,ORC文件包含一些其他信息,如操作等。如果你打开你的ORC文件,它看起来像下面的格式:

(operation, originalTransaction, bucket, rowId, currentTransaction, (ActualData))

,其中ActualData是存储在文件中的实际数据。所以,正如你所看到的,你似乎有6列,而不是你的实际列数。正如微软在这里所说的Polybase的限制,你将无法读取ORC事务文件。

这不是答案,而是故障排除的一个步骤。尝试创建带有虚拟字段(即虚拟int)的外部表,并运行查询。当由于列不匹配而失败时,它会告诉您找到了哪些字段及其排序规则。这可以帮助您进一步排除故障。