我是Azure和Polybase的新手,我正在尝试将CSV文件读入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;
你有几个选择:
REJECT_TYPE
到VALUE
,REJECT_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
我的结果:
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
使用'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'的查询时跳过第一行。
Skip header rows on SQL Data Warehouse PolyBase load
通常使用包含列名称的标题行创建分隔文本文件。在加载期间,需要从数据集中排除这些行。 Azure SQL数据仓库用户现在可以通过使用PolyBase加载的分隔文本文件格式的First_Row选项来跳过这些行。 First_Row选项定义在每个加载的文件中读取的第一行。通过将值设置为2,您可以有效地跳过所有文件的标题行。有关更多信息,请参阅CREATE EXTERNAL FILE FORMAT语句的文档。