この質問を正しく構成しているかどうかさえわかりませんが、試してみます。LinuxシステムでOracleエクスポートから生成された大量のテキストファイルがたくさんあります。各ファイルのサイズは約30 GBで、そのうちの約50個があります。
目標は、このデータをAzure SQL Data Warehouseにエクスポートすることです。この場合のBCPは、データのサイズを考慮して適切な方法ではないため、Polybaseを使用する必要がありました。
ASCIIからUTF8エンコーディングに変換した後、外部テーブルのクエリ中に問題が発生しました。Polybaseは、各行に改行がある固定幅のテキストファイルでうまく再生できません。
テキストファイルは次のようになります。
101,102,103,104,105,106,107 108,108,109,110,111,112,113 114,115,116,117,118,119,120 121,122,123 -何もない、空白行 .. ____。] 201,202,203,204,205,206,207 208,209,210,211,212,213,214 215,216,217
Polybaseは101から107までの処理を試み、このファイルに処理するのに十分な列がなかったというエラーメッセージが表示されます。
これが私の考えていることです。固定幅と改行は、改行を行区切り文字として扱います。
このファイルを次のように変換するにはどうすればよいですか。
101、102、103、104、105、106、107、108、108、109、110、111、112、113、114、115、116、117、118、119、120、121、122、123
編集: これはサンプルデータです ファイルから。私はそれをWindows VMのgit bashで開きました。
これらのファイルには、,
を列セパレータとして使用します。問題は、各行が複数の行を生成するため、Polybase外部テーブルからそれらを処理することが難しいことです。
最終的にsedを使用してファイルをクレンジングしました
zcat myfile.txt.gz | sed -r 's/[ ]+/vin/g'|tr -d '\n'|tr 'vinvin' '\n'|grep -v '^$' > myfile.txt
これにより、ソースファイルのフォーマットの問題が解決されました。これらのファイルがAzure Blob Storageにアップロードされると、残りは簡単でした。 Polybaseを介してBLOB上のファイルを指す外部テーブルを作成し、CREATE TABLE dbo.internal AS SELECT * FROM blob.external
を使用して内部テーブルを作成しました。 700 DWH容量のAzure DWHインスタンスは、外部テーブルから5分で約50 mln行をロードできました。
Polybaseは強力ですが、それほど洗練されていないため、この奇妙な形式を処理できません。私が見るように、3つのオプションがあります。
上記の質問に答えて、サンプルファイルを提供してください。私がお手伝いします。
16進エディタによると、サンプルファイルには、一部の行末に単一のラインフィード(0A)があり、行間の区切り文字として2つのラインフィードがあります。
U-SQLカスタムエクストラクターはこのファイルを処理できる可能性がありますが、30GBのフルファイルで問題が発生するかどうか疑問に思います。
U-SQLスクリプトを追加し、以下のテキストをU-SQL分離コードファイルに追加します。
using System.Collections.Generic;
using System.IO;
using System.Text;
using Microsoft.Analytics.Interfaces;
namespace Utilities
{
[SqlUserDefinedExtractor(AtomicFileProcessing = true)]
public class MyExtractor : IExtractor
{
//Contains the row
private readonly Encoding _encoding;
private readonly byte[] _row_delim;
private readonly char _col_delim;
public MyExtractor()
{
_encoding = Encoding.UTF8;
_row_delim = _encoding.GetBytes("\n\n");
_col_delim = '|';
}
public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output)
{
string s = string.Empty;
string x = string.Empty;
foreach (var current in input.Split(_row_delim))
{
using (System.IO.StreamReader streamReader = new StreamReader(current, this._encoding))
{
while ((s = streamReader.ReadLine()) != null)
{
//Strip any line feeds
//s = s.Replace("/n", "");
// Concatenate the lines
x += s;
}
//Create the output
output.Set<string>(0, x);
yield return output.AsReadOnly();
// Reset
x = string.Empty;
}
}
}
}
}
カスタムエクストラクターを使用してファイルを処理します。
@input =
EXTRACT col string
FROM "/input/input42_2.txt"
USING new Utilities.MyExtractor();
// Output the file
OUTPUT @input
TO "/output/output.txt"
USING Outputters.Tsv(quoting : false);
これにより、Polybaseを使用してインポートできるクリーンアップファイルが生成されました。
幸運を!