【问题标题】:Polybase to connect local CSV filePolybase 连接本地 CSV 文件
【发布时间】:2020-07-20 20:46:54
【问题描述】:

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

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

【问题讨论】:

    标签: sql-server polybase


    【解决方案1】:

    这需要几个步骤才能使其成功运行。作为先决条件,您需要确保 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 数据源(64 位) UI 中选择 Microsoft Access 文本驱动程序 .然后,您可以选择文件夹、文件类型和文本文件格式的定义。确保使用 64 位数据源。定义完格式详细信息后,您会看到在包含这些详细信息的文件夹中创建了一个 schema.ini 文件。

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

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

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

    【讨论】:

    • 谢谢肯。我会试一试。我会尽快发布我的发现。
    【解决方案2】:

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

    【讨论】:

    • 谢谢拉希姆。虽然这是一个解决方案,但我们的要求是以真正的数据虚拟化方式访问数据(不移动数据)。
    猜你喜欢
    • 2017-08-09
    • 1970-01-01
    • 2021-04-30
    • 2020-07-28
    • 2018-10-06
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多