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

时间:2016-03-21 16:57:55

标签: 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

{@ 1}} 是SQL Server中的[Resume]类型,但在SQL数据仓库中,XML类型应按照{{3}所述转换为XML }。

我使用平面文件varchar(8000)将数据导出到blob,然后从中创建外部表。

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

  

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

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

  

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

如果您尝试在每个列字段上加上引号,则在从外部表中选择行时会出现此错误:SELECT * FROM [HumanResources].[JobCandidate_ext]

  

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

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

1 个答案:

答案 0 :(得分:1)

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

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