Я пытаюсь загрузить несколько файлов через полибазу, и это выдает мне ошибку при создании представления.
select * from dbo.test
fname lname
a.csv null
b.csv null
Я могу успешно создать источник данных и внешнюю таблицу без каких-либо проблем.
Ошибка кода
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
Я пытаюсь создать процедуру, используя приведенное выше представление, для динамической загрузки данных с использованием нескольких файлов.
dbo.test содержит только столбцы fname и lname.
Рассматривали ли вы возможность добавления столбца DATA_FILE_NAME
в таблицу dbo.test
? Или изменить все ссылки в вашем представлении, которые указывают на DATA_FILE_NAME
, на один из столбцов в вашей таблице, скажем, fname
?
Если я изменю это DATA_FILE_NAME AS fname, я получаю ту же ошибку.
Поскольку все они нацелены на одну и ту же таблицу, вам не нужно использовать этот пофайловый метод. Polybase загрузит набор файлов, похожий на подстановочный знак. Если вы поместите все свои файлы данных одного типа в папку и установите ПАПКУ в качестве местоположения, все файлы в папке будут загружаться параллельно. Вы обнаружите, что ваши загрузки выполняются намного быстрее… в данный момент вы обрабатываете файлы последовательно, используя метод, который я предлагаю, будет обрабатывать их параллельно так быстро, как только читатели будут доступны.
Спасибо, Рон, за ваш комментарий, но как добиться инкрементной загрузки в PolyBase?
Загрузите во временную таблицу, затем вставьте в целевую таблицу с предложением WHERE NOT EXISTS. Немного лучшим подходом может быть CTAS в новую таблицу из объединения старой таблицы и WHERE NOT EXISTS из новой таблицы.
Вы хотите сказать, если у меня есть ежедневный файл a_02_05_19.txt и a_02_06_19.txt. Вы хотите сказать, загрузите оба файла во временную таблицу и выберите только сегодняшние данные из внешней таблицы и загрузите в постоянную таблицу.
Нет, извините, если я не ясно выразился. Поместите все ваши файлы в папку "a". Установите это как внешний источник данных. Один оператор CTAS загрузит все файлы из этой папки во временную таблицу. Затем CTAS или INSERT строки из временной таблицы в вашу постоянную таблицу, используя предложение WHERE NOT EXISTS, чтобы игнорировать строки, уже находящиеся в этой постоянной таблице.
Спасибо Рон за ваш ответ. Скажем, если у меня есть 100 файлов, и каждый файл содержит 1 миллион записей. Если я уже загрузил 99 файлов и если мне нужно вставить 100-й, то нужно ли нам загружать все 100 файлов и удалять 99 файловых записей из временной таблицы и загружать их в постоянную таблицу. В этом случае, как производительность будет?
Это превращается в более сложную архитектурную дискуссию, чем я могу описать в комментариях StackOverflow. Пожалуйста, напишите мне … поставьте '.' между Роном и Данном и добавьте в конце @microsoft.com. Мы можем обсудить это подробно.
Таким образом, в таблице
dbo.test
нет столбца с именем ...DATA_FILE_NAME
.