Создать вид в Polybase

Я пытаюсь загрузить несколько файлов через полибазу, и это выдает мне ошибку при создании представления.

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 нет столбца с именем ... DATA_FILE_NAME.

wBob 05.02.2019 23:34

dbo.test содержит только столбцы fname и lname.

Jo Joseph 06.02.2019 01:25

Рассматривали ли вы возможность добавления столбца DATA_FILE_NAME в таблицу dbo.test? Или изменить все ссылки в вашем представлении, которые указывают на DATA_FILE_NAME, на один из столбцов в вашей таблице, скажем, fname?

wBob 06.02.2019 02:20

Если я изменю это DATA_FILE_NAME AS fname, я получаю ту же ошибку.

Jo Joseph 06.02.2019 03:18
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
4
281
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку все они нацелены на одну и ту же таблицу, вам не нужно использовать этот пофайловый метод. Polybase загрузит набор файлов, похожий на подстановочный знак. Если вы поместите все свои файлы данных одного типа в папку и установите ПАПКУ в качестве местоположения, все файлы в папке будут загружаться параллельно. Вы обнаружите, что ваши загрузки выполняются намного быстрее… в данный момент вы обрабатываете файлы последовательно, используя метод, который я предлагаю, будет обрабатывать их параллельно так быстро, как только читатели будут доступны.

Спасибо, Рон, за ваш комментарий, но как добиться инкрементной загрузки в PolyBase?

Jo Joseph 06.02.2019 04:50

Загрузите во временную таблицу, затем вставьте в целевую таблицу с предложением WHERE NOT EXISTS. Немного лучшим подходом может быть CTAS в новую таблицу из объединения старой таблицы и WHERE NOT EXISTS из новой таблицы.

Ron Dunn 06.02.2019 08:59

Вы хотите сказать, если у меня есть ежедневный файл a_02_05_19.txt и a_02_06_19.txt. Вы хотите сказать, загрузите оба файла во временную таблицу и выберите только сегодняшние данные из внешней таблицы и загрузите в постоянную таблицу.

Jo Joseph 06.02.2019 19:46

Нет, извините, если я не ясно выразился. Поместите все ваши файлы в папку "a". Установите это как внешний источник данных. Один оператор CTAS загрузит все файлы из этой папки во временную таблицу. Затем CTAS или INSERT строки из временной таблицы в вашу постоянную таблицу, используя предложение WHERE NOT EXISTS, чтобы игнорировать строки, уже находящиеся в этой постоянной таблице.

Ron Dunn 06.02.2019 22:44

Спасибо Рон за ваш ответ. Скажем, если у меня есть 100 файлов, и каждый файл содержит 1 миллион записей. Если я уже загрузил 99 файлов и если мне нужно вставить 100-й, то нужно ли нам загружать все 100 файлов и удалять 99 файловых записей из временной таблицы и загружать их в постоянную таблицу. В этом случае, как производительность будет?

Jo Joseph 06.02.2019 23:01

Это превращается в более сложную архитектурную дискуссию, чем я могу описать в комментариях StackOverflow. Пожалуйста, напишите мне … поставьте '.' между Роном и Данном и добавьте в конце @microsoft.com. Мы можем обсудить это подробно.

Ron Dunn 07.02.2019 02:45

Другие вопросы по теме