【问题标题】:PolyBase create an external table to query Hadoop, column count mismatchPolyBase创建外部表查询Hadoop,列数不匹配
【发布时间】:2021-05-04 05:30:47
【问题描述】:

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

/warehouse/tablespace/managed/hive/xxxxxxx/dxxxxxx/created_month=2019-11/base_0000083/bucket_00001 的结构 文件版本:0.12 和 ORC_135 行数:51107 压缩:ZLIB 压缩大小:262144 编号:整数, xxx xxx xxx

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

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

抛出此错误:

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

有人可以帮帮我吗?

【问题讨论】:

    标签: sql hadoop hive polybase


    【解决方案1】:

    当 ORC 创建为事务表时发生。在这种情况下,ORC 文件包含一些其他信息,如操作等。如果您打开您的 ORC 文件,它将如下所示:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2019-12-17
        • 2019-07-01
        • 2021-08-01
        • 2021-11-15
        • 2020-11-21
        • 2015-12-30
        • 2021-05-01
        • 2022-01-02
        • 2020-03-16
        相关资源
        最近更新 更多