Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Polybase中不允许字符串中存在字符串分隔符?_Sql Server_Data Warehouse_Polybase - Fatal编程技术网

Sql server Polybase中不允许字符串中存在字符串分隔符?

Sql server Polybase中不允许字符串中存在字符串分隔符?,sql-server,data-warehouse,polybase,Sql Server,Data Warehouse,Polybase,我正在使用存储在Azure Data Lake存储中的CSV创建一个外部表,并使用SQL Server中的Polybase填充该表 但是,我遇到了这个问题,并认为这可能是因为在一个特定列中,字符串中存在双引号,并且在Polybase中字符串分隔符被指定为“(string\u delimiter='”) 例如: 我在这方面做了相当广泛的研究,发现这个问题已经存在多年了,但还没有看到任何解决方案 任何帮助都将不胜感激。我认为解决这个问题的最简单方法是使用一个不是逗号的分隔符,而不使用字符串分隔符,

我正在使用存储在Azure Data Lake存储中的CSV创建一个外部表,并使用SQL Server中的Polybase填充该表

但是,我遇到了这个问题,并认为这可能是因为在一个特定列中,字符串中存在双引号,并且在Polybase
中字符串分隔符被指定为
(string\u delimiter='”)

例如:

我在这方面做了相当广泛的研究,发现这个问题已经存在多年了,但还没有看到任何解决方案


任何帮助都将不胜感激。

我认为解决这个问题的最简单方法是使用一个不是逗号的分隔符,而不使用字符串分隔符,因为您负责.csv的创建。使用您知道不会出现在文件中的分隔符。我在我的示例中使用了一个管道,在将字符串导入数据库后,我会清理它

一个简单的例子:

IF EXISTS ( SELECT * FROM sys.external_tables WHERE name = 'delimiterWorking' )
DROP EXTERNAL TABLE delimiterWorking
GO

IF EXISTS ( SELECT * FROM sys.tables WHERE name = 'cleanedData' )
DROP TABLE cleanedData
GO



IF EXISTS ( SELECT * FROM sys.external_file_formats WHERE name = 'ff_delimiterWorking' )
DROP EXTERNAL FILE FORMAT ff_delimiterWorking
GO

CREATE EXTERNAL FILE FORMAT ff_delimiterWorking
WITH (
    FORMAT_TYPE = DELIMITEDTEXT,
    FORMAT_OPTIONS (
        FIELD_TERMINATOR = '|',
        --STRING_DELIMITER = '"',
        FIRST_ROW = 2,
        ENCODING = 'UTF8'
        )
);
GO


CREATE EXTERNAL TABLE delimiterWorking (
    id                  INT NOT NULL,
    body                VARCHAR(8000) NULL
)
WITH (
    LOCATION = 'yourLake/someFolder/delimiterTest6.txt',
    DATA_SOURCE = ds_azureDataLakeStore,
    FILE_FORMAT = ff_delimiterWorking,
    REJECT_TYPE = VALUE,
    REJECT_VALUE = 0
);
GO


SELECT *
FROM delimiterWorking
GO



-- Fix up the data
CREATE TABLE cleanedData
WITH (
    CLUSTERED COLUMNSTORE INDEX,
    DISTRIBUTION = ROUND_ROBIN
    )
AS
SELECT
    id,
    body AS originalCol,
    SUBSTRING ( body, 2, LEN(body) - 2 ) cleanBody
FROM delimiterWorking
GO



SELECT *
FROM cleanedData
我的结果:


如果将Data lake平面文件转换为拼花格式,则可以避免字符串分隔符问题

输入:

“ID” “姓名” “评论” "1" “戴夫” “嗨”我是Dave“来自” "2" “奥罗” “奥罗”
你能提供一些样本数据吗?这可能就是问题所在。我添加了一个字符串,它类似于我的一列中显示的字符串,我认为这是Polybase不允许出现类似情况的问题。我的方法是不指定字符串分隔符,导入该数据并使用SQL清理它。另一种思考方式是,您能否用英语编写一条规则,以便导入时遵循?假设您的数据有其他列,您能否提供一个更真实的示例?如果您的示例是正确的,则您没有处理正确编码的CSV文件。请您将该字符串编码为:
“Hello”“world”,“it's me”
(注意世界各地的双引号)。这不会删除字母
I
之前的引号吗?@user3396351,更正它仍然是一个错误,然后,我们可以为除(字符串分隔符)之外的所有引号引入转义字符. 无论是平面/拼花地板形式
IF EXISTS ( SELECT * FROM sys.external_tables WHERE name = 'delimiterWorking' )
DROP EXTERNAL TABLE delimiterWorking
GO

IF EXISTS ( SELECT * FROM sys.tables WHERE name = 'cleanedData' )
DROP TABLE cleanedData
GO



IF EXISTS ( SELECT * FROM sys.external_file_formats WHERE name = 'ff_delimiterWorking' )
DROP EXTERNAL FILE FORMAT ff_delimiterWorking
GO

CREATE EXTERNAL FILE FORMAT ff_delimiterWorking
WITH (
    FORMAT_TYPE = DELIMITEDTEXT,
    FORMAT_OPTIONS (
        FIELD_TERMINATOR = '|',
        --STRING_DELIMITER = '"',
        FIRST_ROW = 2,
        ENCODING = 'UTF8'
        )
);
GO


CREATE EXTERNAL TABLE delimiterWorking (
    id                  INT NOT NULL,
    body                VARCHAR(8000) NULL
)
WITH (
    LOCATION = 'yourLake/someFolder/delimiterTest6.txt',
    DATA_SOURCE = ds_azureDataLakeStore,
    FILE_FORMAT = ff_delimiterWorking,
    REJECT_TYPE = VALUE,
    REJECT_VALUE = 0
);
GO


SELECT *
FROM delimiterWorking
GO



-- Fix up the data
CREATE TABLE cleanedData
WITH (
    CLUSTERED COLUMNSTORE INDEX,
    DISTRIBUTION = ROUND_ROBIN
    )
AS
SELECT
    id,
    body AS originalCol,
    SUBSTRING ( body, 2, LEN(body) - 2 ) cleanBody
FROM delimiterWorking
GO



SELECT *
FROM cleanedData