代码之家  ›  专栏  ›  技术社区  ›  RaviLobo

Polybase连接本地CSV文件

  •  0
  • RaviLobo  · 技术社区  · 4 年前

    我无法从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
    );
    
    0 回复  |  直到 4 年前
        1
  •  4
  •   Ken Muse    4 年前

    这需要几个步骤才能使其成功工作。作为先决条件,您需要确保SQL Server 2019已更新为CU4( KB4548597 )修复一些已知问题。对于免费解决方案,您需要安装64位版本 Microsoft Access Database Engine 2016 Redistributable 。这将安装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位) 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
  •  0
  •   Rahim    4 年前

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