PolyBase 创建一个外部 table 来查询 Hadoop,列数不匹配

PolyBase create an external table to query Hadoop, column count mismatch

我们有 运行 一个 polybase 服务来查询我们的 hadoop 集群。 这是我们 hadoop 端的文件结构:

Structure for /warehouse/tablespace/managed/hive/xxxxxxx/dxxxxxx/created_month=2019-11/base_0000083/bucket_00001 File Version: 0.12 with ORC_135 Rows: 51107 Compression: ZLIB Compression size: 262144 id:int, xxx xxx xxx

这边有16个字段

在另一边,我创建了一个文件格式如下:

    CREATE EXTERNAL FILE FORMAT [OrcFileFormat] WITH (
    FORMAT_TYPE = ORC,
     DATA_COMPRESSION = N'org.apache.hadoop.io.compress.DefaultCodec')
   

和外部table如下:

    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,将时间戳更改为日期时间。 table创建成功;但是,当执行以下查询时:

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

抛出此错误:

Cannot execute the query "Remote Query" against OLE DB provider "MSOLEDBSQL" for linked server "(null)". External file access failed due to internal error: 'File //warehouse/tablespace/managed/hive/xxxxxxx/dxxxxxx/created_month=2019-11/base_0000083/bucket_00001: HdfsBridge::CreateRecordReader - Unexpected error encountered creating the record reader: HadoopExecutionException: Column count mismatch. Source file has 6 columns, external table definition has 16 columns.'

有人可以帮帮我吗?

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

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

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

其中 ActualData 是您存储在文件中的实际数据。因此,如您所见,您的实际列数似乎有 6 列。正如 Microsoft 所说的 Polybase 限制 here,您将无法读取 ORC 交易文件。