6

SQL Data Warehouse (編集者はこれを変更しないでください。実際の名前です。ここを参照してください) には、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 ファイルから予想されるように) キャリッジ リターンが含まれているため、実行するSELECT * FROM [HumanResources].[JobCandidate_ext]とエラーが発生します。この場合:

クエリが中止されました -- 外部ソースからの読み取り中に拒否の最大しきい値 (0 行) に達しました: 処理された合計 2 行のうち 1 行が拒否されました。
(/[HumanResources].[JobCandidate]/data.txt)列の序数: 0、予期されるデータ型: INT、問題のある値: テキスト .... (列変換エラー)、エラー: データ型 NVARCHAR を INT に変換中にエラーが発生しました。

here で説明されているように、外部テーブルを作成するときに行区切り記号を構成できないことはわかっています。

行区切り文字は UTF-8 で、Hadoop の LineRecordReader でサポートされている必要があります。行区切り文字は、'\r'、'\n'、または '\r\n' のいずれかでなければなりません。これらはユーザーが構成できません。

また、各列フィールドに引用符を付けようとすると、外部テーブルから行を選択しているときに次のエラーが発生します: No closing string delimiter.

クエリが中止されました -- 外部ソースからの読み取り中に最大拒否しきい値 (0 行) に達しました: 処理された合計 1 行のうち 1 行が拒否されました。
(/[HumanResources].[JobCandidate]/data.txt)列序数: 2、予期されるデータ型: VARCHAR(8000) collat​​e SQL_Latin1_General_CP1_CI_AS、問題の値: 'ShaiBassli (トークン化に失敗)、エラー: 終了文字列区切り文字がありません。

この問題を回避する方法はありますか?

4

1 に答える 1

1

現在、PolyBase では、フィールド内で行またはフィールドの区切り記号を使用できません。つまり、これらの文字をエスケープすることはできません。Greg が指摘したように、ここでこの機能に投票できます。 -f

この制限を回避するには、PolyBase で読み取る前に、データを前処理して (たとえば、sed または tr を使用して) 不要な文字を置き換えることができます。または、Polybase でサポートされている他のファイル形式 RCFile/ORC/Parquet に切り替えて、行とフィールドの区切り記号を完全に処理しないようにすることもできます。

于 2016-03-23T23:35:08.483 に答える