Polybase CREATE EXTERNAL TABLE跳过标题

问题描述 投票:3回答:3

我是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;
sql-server azure blob azure-sql-database azure-storage-blobs
3个回答
4
投票

你有几个选择:

  1. 永久删除文件头,因为Polybase实际上并不适用于文件头
  2. 使用Azure数据工厂,当文件位于Blob存储中时,它具有跳过标题行的选项
  3. 设置Polybase表的拒绝选项以尝试忽略标题行,即setREJECT_TYPEVALUEREJECT_VALUE为1,例如,这有点hacky,因为你无法控制这是否实际上是标题行,但如果您只有一个标题行并且它是文件中唯一的错误,它将起作用。以下示例。

对于名为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

HTH


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 [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'的查询时跳过第一行。


0
投票

Skip header rows on SQL Data Warehouse PolyBase load

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

© www.soinside.com 2019 - 2024. All rights reserved.