6

在 SQL 数据仓库中(请编辑不要更改此名称,实际名称请参见:此处)我有一个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

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

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

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

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

我知道在创建外部表时无法配置行分隔符,如此所述。

行分隔符必须是 UTF-8 并受 Hadoop 的 LineRecordReader 支持。行分隔符必须是“\r”、“\n”或“\r\n”。这些不是用户可配置的。

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

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

有没有办法解决这个问题?

4

1 回答 1

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,以避免完全处理行和字段分隔符。

于 2016-03-23T23:35:08.483 回答