在SQL数据仓库中创建/选择外部表时处理嵌入的新行

san*_*ago 5 sql-server azure azure-sqldw

在SQL数据仓库中(编辑请不要改变它,它的实际名称见:here)我有一个JobCandidate_ext外观表,看起来像这样.

CREATE EXTERNAL TABLE [HumanResources].[JobCandidate_ext](
    [JobCandidateID] int,
    [BusinessEntityID] int,
    [Resume] Varchar(8000),
    [ModifiedDate] Datetime
)
WITH (
    LOCATION='/[HumanResources].[JobCandidate]/data.txt',
    DATA_SOURCE=AzureStorage,
    FILE_FORMAT=TextFile)
GO
Run Code Online (Sandbox Code Playgroud)

该列[Resume] XML SQL Server 中的一种类型,但在SQL数据仓库中,XML类型应转换varchar(8000)此处所述.

我使用平面文件data.txt将数据导出到blob,然后从中创建外部表.

[Resume]列中包含回车符(正如XML文件所预期的那样),因此当您运行时SELECT * FROM [HumanResources].[JobCandidate_ext]会出现错误.在这种情况下:

查询已中止 - 从外部源读取时达到最大拒绝阈值(0行):处理的总共2行中有1行被拒绝.
(/ [HumanResources].[JobCandidate]/data.txt)Column ordinal:0,预期数据类型:INT,违规值:某些文本....(列转换错误),错误:将数据类型NVARCHAR转换为INT时出错.

我知道,在创建外部表时所描述的,我不能配置行分隔符这里.

行分隔符必须为UTF-8,并由Hadoop的LineRecordReader支持.行分隔符必须是'\ r','\n'或'\ r \n'.这些不是用户可配置的.

如果您尝试在每个列字段上放置引号,则在从外部表中选择行时会出现此错误:No closing string delimiter.

查询已中止 - 从外部源读取时达到最大拒绝阈值(0行):处理的总共1行中拒绝了1行.
(/ [HumanResources].[JobCandidate]/data.txt)Column ordinal:2,预期数据类型:VARCHAR(8000)整理SQL_Latin1_General_CP1_CI_AS,违规值:'ShaiBassli(标记失败),错误:没有关闭字符串分隔符.

有办法解决这个问题吗?

Sah*_*SFT 1

如今,PolyBase 不允许在字段内使用行或字段分隔符,即它不允许您转义这些字符。正如 Greg 指出的那样,您可以在这里投票支持此功能:https ://feedback.azure.com/forums/307516-sql-data-warehouse/suggestions/10600132-polybase-allow-line-ends-within-qualified-text -F

要解决此限制,您可以在使用 PolyBase 读取数据之前对数据进行预处理(例如使用 sed 或 tr)以替换不需要的字符。或者您可以切换到其他 Polybase 支持的文件格式 RCFile/ORC/Parquet,以避免完全处理行和字段分隔符。