2

我无法从 SQL Server 2019 Polybase 访问本地 CSV 文件。这是一个简单的 3 列文本文件。我还创建了一个本地系统 DSN(来自 ODBC32 UI)。

我从这里得到了示例代码。但是,链接(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
);
4

2 回答 2

3

这需要几个步骤才能使其成功运行。作为先决条件,您需要确保 SQL Server 2019 已更新到 CU4 ( KB4548597 ) 以修复一些已知问题。对于免费的解决方案,您需要安装 64 位版本的Microsoft Access Database Engine 2016 Redistributable。这将安装 64 位版本的 ODBC 驱动程序。

有了这两件事,您现在可以创建外部数据源。我建议禁用PUSHDOWN. 我已经看到它会导致这个特定驱动程序出现一些问题。

如果您想直接连接到包含标题行的 CSV 文件,您可以通过简单地指定 Access Text Driver 和包含文件的文件夹来创建外部数据源:

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 Data Sources (64-bit ) UI 中选择Microsoft Access Text Driver。然后,您可以选择文件夹、文件类型和文本文件格式的定义。确保使用 64 位数据源。定义完格式详细信息后,您会看到schema.ini在包含这些详细信息的文件夹中创建了一个文件。

对于外部数据源,您将指定 DSN 的名称:

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

EXTERNAL TABLE创建方式与以前相同,列名和数据类型与您在 DSN 中声明的定义相匹配。

于 2020-04-10T23:04:41.767 回答
0

要直接创建数据源,您需要购买该驱动程序。那是选项 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 函数将数据加载到表中。

于 2020-04-10T22:24:53.710 回答