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