polybase创建外部表来查询hadoop,列计数不匹配

wswtfjt7  于 2021-07-15  发布在  Hadoop
关注(0)|答案(2)|浏览(290)

我们已经运行了一个polybase服务来查询hadoop集群。以下是hadoop端的文件结构:
/warehouse/tablespace/managed/hive/x/d/created\u month=2019-11/base\u0000083/bucket\u 00001文件版本:0.12,带orc\u 135行:51107压缩:zlib压缩大小:262144 id:int,
这边有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)

使用完全复制的字段,对数据类型的唯一更改是string到varchar和timestamp到datetime。表创建成功;但是,执行以下查询时:

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

引发此错误:
无法对链接服务器(null)的ole db提供程序“msoledbsql”执行查询“remote query”。由于内部错误,外部文件访问失败:“file//warehouse/tablespace/managed/hive/x/d/created\u month=2019-11/base\u0000083/bucket\u 00001:hdfsbridge::createrecordreader-创建记录读取器时遇到意外错误:hadoopexecutionexception:列计数不匹配。源文件有6列,外部表定义有16列
有人能帮帮我吗?

ssm49v7z

ssm49v7z1#

它发生在orc被创建为事务表时。在这种情况下,orc文件包含一些其他信息,如操作等。如果打开orc文件,其格式如下: (operation, originalTransaction, bucket, rowId, currentTransaction, (ActualData)) 其中actualdata是存储在文件中的实际数据。所以,如您所见,相对于实际列数,您似乎有6列。正如微软在这里所说的polybase限制,您将无法读取orc事务文件。

f1tvaqid

f1tvaqid2#

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

相关问题