Polybase CREATE EXTERNAL TABLE跳过标题

时间:2016-10-04 16:02:17

标签: sql-server azure blob azure-sql-database azure-storage-blobs

我是Azure和Polybase的新手,我正在尝试将CS​​V文件读入SQL外部表。

我注意到,我不能跳过第一行,我读过的某些论坛上的标题。

我希望相反,你能帮助我吗?

我使用的代码如下。

提前致谢

 CREATE EXTERNAL TABLE dbo.Test2External (
   [Guid] [varchar](36) NULL,
    [Year] [smallint] NULL,
    [SysNum] [bigint] NULL,
    [Crc_1] [decimal](15, 2) NULL,
    [Crc_2] [decimal](15, 2) NULL,
    [Crc_3] [decimal](15, 2) NULL,
    [Crc_4] [decimal](15, 2) NULL,
    [CreDate] [date] NULL,
    [CreTime] [datetime] NULL,
    [UpdDate] [date] NULL,
    ...
WITH (
    LOCATION='/20160823/1145/FIN/',
    DATA_SOURCE=AzureStorage,
    FILE_FORMAT=TextFile
);


-- Run a query on the external table

SELECT count(*) FROM dbo.Test2External;

3 个答案:

答案 0 :(得分:4)

您有几个选择:

  1. 永久删除文件标头,因为Polybase并不真正意图使用文件标题
  2. 使用Azure数据工厂,该文件具有在文件位于Blob存储中时跳过标题行的选项
  3. 设置Polybase表的拒绝选项以尝试忽略标题行,即将REJECT_TYPE设置为VALUE,将REJECT_VALUE设置为1,例如 这有点hacky,因为您无法控制这是否实际上是标题行,但如果您只有一个标题行并且它是文件中的唯一错误,它将起作用。示例如下。
  4. 对于名为temp.csv的文件,其内容为:

    a,b,c
    1,2,3
    4,5,6
    

    这样的命令可以起作用:

    CREATE EXTERNAL TABLE dbo.mycsv (
        colA INT NOT NULL,
        colB INT NOT NULL,
        colC INT NOT NULL
    )
    WITH (
        DATA_SOURCE = eds_esra,
        LOCATION = N'/temp.csv',
        FILE_FORMAT = eff_csv,
        REJECT_TYPE = VALUE,
        REJECT_VALUE = 1
        )
    GO
    
    SELECT *
    FROM dbo.mycsv
    

    我的结果:

    Results

    1. 将外部表的数据类型设置为VARCHAR,仅用于暂存数据,然后在使用ISNUMERIC之类的内容转换为内部表时删除标题行,例如

      CREATE EXTERNAL TABLE dbo.mycsv2 (
          colA VARCHAR(5) NOT NULL,
          colB VARCHAR(5) NOT NULL,
          colC VARCHAR(5) NOT NULL
      )
      WITH (
          DATA_SOURCE = eds_esra,
          LOCATION = N'/temp.csv',
          FILE_FORMAT = eff_csv,
          REJECT_TYPE = VALUE,
          REJECT_VALUE = 0
          )
      GO
      
      
      CREATE TABLE dbo.mycsv3
      WITH (
          CLUSTERED INDEX ( colA ),
          DISTRIBUTION = ROUND_ROBIN
          )
      AS
      SELECT
          colA,
          colB,
          colC
      FROM dbo.mycsv2
      WHERE ISNUMERIC( colA ) = 1
      GO
      
    2. HTH

答案 1 :(得分:3)

使用'EXTERNAL FILE FORMAT'和'FIRST_ROW = 2'有一种解决方法。 例如如果我们创建文件格式

CREATE EXTERNAL FILE FORMAT [CsvFormatWithHeader] WITH (
    FORMAT_TYPE = DELIMITEDTEXT, 
    FORMAT_OPTIONS (
        FIELD_TERMINATOR = ',', 
        FIRST_ROW  = 2,
        STRING_DELIMITER = '"',
        USE_TYPE_DEFAULT = False
        )
)
GO

然后将此文件格式与create external table

一起使用
CREATE EXTERNAL TABLE [testdata].[testfile1]
(
    [column1] [nvarchar](4000) NULL
)
WITH (DATA_SOURCE = data_source,
LOCATION = file_location,
FILE_FORMAT = [CsvFormatWithHeader],REJECT_TYPE = PERCENTAGE,REJECT_VALUE = 100,REJECT_SAMPLE_VALUE = 1000)

在执行'testdata.testfile1'的查询时会跳过第一行。

答案 2 :(得分:0)

Skip header rows on SQL Data Warehouse PolyBase load

通常使用包含列名称的标题行创建分隔文本文件。在加载期间,需要从数据集中排除这些行。 Azure SQL数据仓库用户现在可以通过使用PolyBase加载的分隔文本文件格式的First_Row选项来跳过这些行。 First_Row选项定义在每个加载的文件中读取的第一行。通过将值设置为2,您可以有效地跳过所有文件的标题行。 有关更多信息,请参阅CREATE EXTERNAL FILE FORMAT语句的文档。