Polybase для подключения локального файла CSV

Я не могу получить доступ к локальному CSV-файлу из SQL Server 2019 Polybase. Это простой текстовый файл с тремя столбцами. Я также создал локальный системный DSN (из пользовательского интерфейса ODBC32).

Я получил образец кода из здесь. Однако драйвер в ссылке (cdata) не бесплатный. Любая помощь в решении этой проблемы будет принята с благодарностью.

create master key encryption by password = 'Polybase2CSV';

create database scoped credential csv_creds
with identity = 'username', secret = 'password';

create external data source csv_source
with ( 
  location = 'odbc://localhost',
  connection_options = 'DSN=CustomerDSN', -- this is the DSN name 
  -- PUSHDOWN = ON | OFF,
  credential = csv_creds
);


CREATE EXTERNAL TABLE Customer
(
    CUSTOMERID int,
    CUSTOMERNAME varchar(250),
    DEPARTMENT varchar(250)
) WITH (
    LOCATION='customer.txt',
    DATA_SOURCE=csv_source
);

person RaviLobo    schedule 08.04.2020    source источник


Ответы (2)


Это требует нескольких шагов, чтобы заставить его работать успешно. В качестве предварительных условий вам необходимо убедиться, что SQL Server 2019 обновлен до CU4 (KB4548597).), чтобы исправить несколько известных проблем. Для бесплатного решения вам потребуется установить 64-разрядную версию Распространяемый компонент Microsoft Access Database Engine 2016. Это установит 64-разрядную версию драйверов ODBC.

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

Если вы хотите напрямую подключиться к CSV-файлу, содержащему строку заголовка, вы можете создать внешний источник данных, просто указав текстовый драйвер Access и папку, которая будет содержать файлы:

CREATE EXTERNAL DATA SOURCE MyODBC
WITH 
( 
    LOCATION = 'odbc://localhost',
    CONNECTION_OPTIONS = 'Driver=Microsoft Access Text Driver (*.txt, *.csv);Dbq=F:\data\files\',
    PUSHDOWN = OFF
);

Чтобы использовать источник данных, необходимо создать определение внешней таблицы, отражающее формат файла. Параметр LOCATION будет именем загружаемого файла. Вы можете заключить имя файла и имя драйвера в фигурные скобки, чтобы избежать проблем со специальными символами. Важно убедиться, что имена столбцов, которые вы определяете для этой таблицы, совпадают с именами в строке заголовка. Поскольку вы используете CU4, если тип данных не соответствует ожиданиям драйвера, вы получите сообщение об ошибке, указывающее, какие типы данных ожидаются.

CREATE EXTERNAL TABLE dbo.CsvData
(
    Name nvarchar(128),
    Count int,
    Description nvarchar(255)
)
WITH
(
    LOCATION='[filename.csv]',
    DATA_SOURCE = [MyODBC]
)

Если вы хотите определить имена столбцов, типы данных и т. д., в пользовательском интерфейсе Источники данных ODBC (64-разрядная версия) выберите Текстовый драйвер Microsoft Access. Затем вы можете выбрать папку, типы файлов и определение формата текстового файла. Обязательно используйте 64-битные источники данных. Как только вы закончите определение деталей формата, вы увидите, что в папке создается файл schema.ini, содержащий эти детали.

Для внешнего источника данных вы укажете имя DSN:

CREATE EXTERNAL DATA SOURCE MyODBC
WITH 
( 
    LOCATION = 'odbc://localhost',
    CONNECTION_OPTIONS = 'DSN=LocalCSV',
    PUSHDOWN = OFF
);

EXTERNAL TABLE создается так же, как и раньше, с именами столбцов и типами данных, соответствующими определению, объявленному вами в DSN.

person Ken Muse    schedule 10.04.2020
comment
Спасибо, Кен. Я попробую. Скоро выложу свою находку. - person RaviLobo; 11.04.2020

Чтобы создать источник данных напрямую, вам необходимо купить этот драйвер. То есть вариант 1, но так как он в окно. У вас есть еще два варианта. Импортируйте эти данные непосредственно в SQL Server или, если вы действительно хотите использовать PolyBase. Загрузите эти данные в промежуточные таблицы SQL, затем создайте внешние таблицы, ссылающиеся на эту промежуточную таблицу.

Мои предположения: данные CSV не устарели. структура/схема останется неизменной. Создайте промежуточную таблицу. Использовать

Import-DbaCSV -Path "D:\CustomerTest\Customer.csv"`
              -SqlInstance ServerName`
              -Database DBName`
              -Table "Customer"

Затем переработайте свой код, чтобы либо подключиться к PolyBase, либо использовать данные напрямую.

CREATE DATABASE SCOPED CREDENTIAL csv_creds
WITH IDENTITY = 'username', SECRET = 'password';

CREATE EXTERNAL DATA SOURCE csv_source
    WITH ( LOCATION = 'sqlserver://SERVERNAME:PORTNUMBER',
    PUSHDOWN = ON,
    CREDENTIAL = csv_creds);

Затем вы можете периодически запускать функцию PS для загрузки данных в таблицу по мере необходимости.

person Rahim    schedule 10.04.2020
comment
Спасибо Рахим. Хотя это решение, наше требование состоит в том, чтобы получить доступ к данным в истинном смысле ВИРТУАЛИЗАЦИИ ДАННЫХ (без перемещения данных). - person RaviLobo; 11.04.2020