Polybase для подключения локального файла CSV - PullRequest
1 голос
/ 08 апреля 2020

Я не могу получить доступ к локальному файлу CSV с SQL Сервер 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
);

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

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

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

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

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]
)

Если вы хотите определить имена столбцов, типы данных и т. д. c. в пользовательском интерфейсе ODB C Источники данных (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.

0 голосов
/ 11 апреля 2020

Чтобы создать источник данных напрямую, вам нужно купить этот драйвер. Это вариант 1, но так как он в окно. У вас есть еще два варианта. Импортируйте эти данные непосредственно на SQL сервер или, если вы действительно хотите использовать 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 для загрузки данных в таблицу по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...