通过Polybase加载特殊字符

时间:2019-02-07 00:10:07

标签: azure azure-sql-database azure-blob-storage azure-sqldw polybase

我正在尝试加载单引号字符串分隔的文件,并且能够加载数据,但某些包含以下格式的字符串的记录除外。如何使用SQL Datawarehouse中的PolyBase在值以下加载此值。任何输入都将受到高度赞赏。

例如:

'Don''t Include'
'1'''
'Can''t'
'VM''s' 

外部文件格式:

CREATE EXTERNAL FILE FORMAT SAMPLE_HEADER
with (format_type=delimitedtext,
format_options(
FIELD_TERMINATOR=',',
STRING_DELIMITER='''',
DATE_FORMAT='yyyy-MM-dd HH:mm:ss',
USE_TYPE_DEFAULT=False)
)

2 个答案:

答案 0 :(得分:0)

在这种情况下,字符串分隔符必须是单引号之外的其他东西。

我假设您使用的是逗号分隔的文件。您有两种选择:

  • 使列定界符不是逗号。
  • 使您的字符串定界符成为数据中不存在的字符
  • 使用CSV以外的其他输出格式,例如Parquet或Orc

如果要使用自定义定界符,建议使用ASCII Decimal(31)或Hex(0x1F),这是专门为此保留的。

如果要使用字符串定界符,则可以使用双引号(但是我猜这是在您的数据中)或选择其他字符。

也就是说,我的下一个猜测是您将遇到带有嵌入式回车符的数据,这将引起另一层问题。因此,建议您将提取的内容移到CSV以外的其他位置,然后转到Parquet或Orc。

答案 1 :(得分:0)

当前,SQLDW does not support中的Polybase以分隔文本格式处理转义字符。因此,您无法在SQLDW中加载文件目录。

为了加载文件,您可以预处理输入文件。在预处理期间,您可能会生成另一个二进制格式的数据文件(PARQUET或ORC,可通过多碱基读取目录)或另一个带有某些特殊字段分隔符的定界文件(数据文件中不需要的任何字符,例如|)。或〜)。具有这种特殊字符,无需使用转义/定界值)

希望它能提供帮助。

From Azure docs

<format_options> ::=  
{  
    FIELD_TERMINATOR = field_terminator  
    | STRING_DELIMITER = string_delimiter 
    | First_Row = integer -- ONLY AVAILABLE SQL DW
    | DATE_FORMAT = datetime_format  
    | USE_TYPE_DEFAULT = { TRUE | FALSE } 
    | Encoding = {'UTF8' | 'UTF16'} 
}