在 Polybase 中创建视图
Create View in Polybase
我正在尝试通过 polybase 加载多个文件,但它在创建视图时抛出了一个错误。
select * from dbo.test
fname lname
a.csv null
b.csv null
我能够毫无问题地成功创建数据源和外部 table。
代码错误
Error in the code.
Msg 207, Level 16, State 1, Line 4
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
代码
IF OBJECT_ID('dbo.TEST_V', 'V') IS NOT NULL
DROP VIEW [dbo].[TEST_V]
GO
-- Create new view
CREATE VIEW [dbo].[TEST_V]
AS
-- Add dynamic T-SQL to temporary table
SELECT
-- Auto increment number
ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS ROW_ID,
-- Data file name
DATA_FILE_NAME AS DATA_FILE,
-- Drop external table if it exists
'IF EXISTS (SELECT * FROM sys.external_tables WHERE NAME = ' +
CHAR(39) + SUBSTRING(DATA_FILE_NAME, 1, LEN(DATA_FILE_NAME) - 11) + CHAR(39) + ') ' +
'DROP EXTERNAL TABLE [dbo].[' + SUBSTRING(DATA_FILE_NAME, 1, LEN(DATA_FILE_NAME) - 11) + '];' AS DROP_STMT,
-- Create new external table
'CREATE EXTERNAL TABLE [dbo].[' + SUBSTRING(DATA_FILE_NAME, 1, LEN(DATA_FILE_NAME) - 11) + '] ' +
'( ' +
'fname [varchar] (70), ' +
'lname [varchar] (70) ' +
') ' +
'WITH ' +
'( ' +
'LOCATION=' + CHAR(39) + '/NEW/' + DATA_FILE_NAME + CHAR(39) + ' ' +
', DATA_SOURCE = SIMPLE' +
', FILE_FORMAT = SIMPLE_HEADER' +
', REJECT_TYPE = VALUE ' +
', REJECT_VALUE = 1 ' +
') ' AS CREATE_STMT,
-- Move data into staging table
'INSERT INTO dbo.fname ' +
'SELECT ' +
' fname ,' +
' lname ' +
'FROM [dbo].[' + SUBSTRING(DATA_FILE_NAME, 1, LEN(DATA_FILE_NAME) - 11) + '] ' +
';' AS INSERT_STMT
FROM
[dbo].[test];
GO
我正在尝试使用上述视图创建过程以使用多个文件动态加载数据。
因为它们都针对相同的 table,所以您不需要使用这种逐个文件的方法。 Polybase 将加载一组类似通配符的文件。如果您将所有相同类型的数据文件放在一个文件夹中,并将文件夹设置为位置,则该文件夹中的所有文件将被并行加载。您会发现您的加载速度大大加快……在您连续处理文件的那一刻,使用我建议的方法将在读者可用时尽可能快地并行处理它们。
我正在尝试通过 polybase 加载多个文件,但它在创建视图时抛出了一个错误。
select * from dbo.test
fname lname
a.csv null
b.csv null
我能够毫无问题地成功创建数据源和外部 table。
代码错误
Error in the code.
Msg 207, Level 16, State 1, Line 4
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
代码
IF OBJECT_ID('dbo.TEST_V', 'V') IS NOT NULL
DROP VIEW [dbo].[TEST_V]
GO
-- Create new view
CREATE VIEW [dbo].[TEST_V]
AS
-- Add dynamic T-SQL to temporary table
SELECT
-- Auto increment number
ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS ROW_ID,
-- Data file name
DATA_FILE_NAME AS DATA_FILE,
-- Drop external table if it exists
'IF EXISTS (SELECT * FROM sys.external_tables WHERE NAME = ' +
CHAR(39) + SUBSTRING(DATA_FILE_NAME, 1, LEN(DATA_FILE_NAME) - 11) + CHAR(39) + ') ' +
'DROP EXTERNAL TABLE [dbo].[' + SUBSTRING(DATA_FILE_NAME, 1, LEN(DATA_FILE_NAME) - 11) + '];' AS DROP_STMT,
-- Create new external table
'CREATE EXTERNAL TABLE [dbo].[' + SUBSTRING(DATA_FILE_NAME, 1, LEN(DATA_FILE_NAME) - 11) + '] ' +
'( ' +
'fname [varchar] (70), ' +
'lname [varchar] (70) ' +
') ' +
'WITH ' +
'( ' +
'LOCATION=' + CHAR(39) + '/NEW/' + DATA_FILE_NAME + CHAR(39) + ' ' +
', DATA_SOURCE = SIMPLE' +
', FILE_FORMAT = SIMPLE_HEADER' +
', REJECT_TYPE = VALUE ' +
', REJECT_VALUE = 1 ' +
') ' AS CREATE_STMT,
-- Move data into staging table
'INSERT INTO dbo.fname ' +
'SELECT ' +
' fname ,' +
' lname ' +
'FROM [dbo].[' + SUBSTRING(DATA_FILE_NAME, 1, LEN(DATA_FILE_NAME) - 11) + '] ' +
';' AS INSERT_STMT
FROM
[dbo].[test];
GO
我正在尝试使用上述视图创建过程以使用多个文件动态加载数据。
因为它们都针对相同的 table,所以您不需要使用这种逐个文件的方法。 Polybase 将加载一组类似通配符的文件。如果您将所有相同类型的数据文件放在一个文件夹中,并将文件夹设置为位置,则该文件夹中的所有文件将被并行加载。您会发现您的加载速度大大加快……在您连续处理文件的那一刻,使用我建议的方法将在读者可用时尽可能快地并行处理它们。