数百のファイルにまたがる大量のデータ セットがあります。どうやら、エンコーディングの問題がいくつかあるようです (ほとんどが UTF-8 ですが、有効でない文字もあるようです)。https://msdn.microsoft.com/en-us/library/azure/mt764098.aspxによると、エンコードエラーがある場合、silent フラグを true に設定しても実行時エラーが発生します (単にスキップすることを目的として)エラー行)。
その結果、カスタム エクストラクタを作成する必要があります。https://blogs.msdn.microsoft.com/data_otaku/2016/10/27/a-fixed-width-extractor-for-azure-data-lakeの例の簡略化されたバージョンを主に実行するものを書きました-analytics/は、行を取得し、区切り文字で分割し、try ブロック内の値を返すだけです。例外があれば、それを処理して次に進みます。
残念ながら、USQL スクリプト自体でこのエクストラクタを実際に参照する際に問題が発生しています。上記のリンクのガイダンスに従うと、別のアセンブリにロジックを記述し、それを構築し、それを ADLS データベース/アセンブリに登録してからREFERENCE ASSEMBLY MyExtractors;
、スクリプトの先頭に含めることを提案しています (これが使用される名前空間であるため)。以下の Using ステートメントでは、次のように呼び出していUSING new SimpleExtractor();
ますtype or namespace cannot be found
。さらに、より正確に using ステートメントで使用しようとするとUSING new MyExtractors.SimpleExtractor();
、上記の USING ステートメントを引用して同じエラーが発生します。
その後、 https://azure.microsoft.com/en-us/documentation/articles/data-lake-analytics-u-sql-develop-user-defined-operators/の古いソースで追加のドキュメントを見つけました。同じことですが、コード ビハインド ファイルにあります。別のアセンブリを削除し、ロジックをそのファイルのクラスにコピーしました。REFERENCE ASSEMBLY
手順 6 の例にはステートメントが表示されていませんが、再度実行すると、 type or namespace name cannot be found
.
ここで何かが古くなっていることを期待して最新のリリースノートを見ると、USING
ステートメントを使用する場合、実際に実行する前に(最初の試行のように)カスタムコードのアセンブリへの参照が必要であることがわかります。私はそれを使用しています。
USQL で UDO を適切に参照する方法、またはランタイムがエンコード例外をサイレントに処理する方法 (およびスキップする方法) について、誰かがガイダンスを提供してもらえますか?
エクストラクタ自体での私のロジックは次のようになります。
using System.Collections.Generic;
using System.IO;
using System.Text;
using Microsoft.Analytics.Interfaces;
namespace Utilities
{
[SqlUserDefinedExtractor(AtomicFileProcessing = true)]
public class ModifiedTextExtractor : IExtractor
{
//Contains the row
private readonly Encoding _encoding;
private readonly byte[] _row_delim;
private readonly char _col_delim;
public ModifiedTextExtractor()
{
_encoding = Encoding.UTF8;
_row_delim = _encoding.GetBytes("\r\n");
_col_delim = '\t';
}
public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output)
{
//Read the input line by line
foreach (var current in input.Split(_row_delim))
{
using (var reader = new StreamReader(current, this._encoding))
{
var line = reader.ReadToEnd().Trim();
//If there are any single or double quotes in the line, escape them
line = line.Replace(@"""", @"\""");
var count = 0;
//Split the input by the column delimiter
var parts = line.Split(_col_delim);
foreach (var part in parts)
{
output.Set<string>(count, part);
count += 1;
}
}
yield return output.AsReadOnly();
}
}
}
}
そして、USQLステートメントでそれを使用しようとしている方法のスニペット(アセンブリとして登録した後):
REFERENCE ASSEMBLY [Utilities];
CREATE VIEW MyView AS ...
USING new Utilities.ModifiedTextExtractor();
ありがとうございました!