複数のファイルからデータを読み取るU-SQLクエリを作成しました。今私はいくつかの他のフォルダ内の複数のファイルにデータを出力する必要があります。私はどのようにすることができU-SQLカスタム抽出プログラムを使用して複数のファイルを動的に出力する方法は?
public class SampleExtractor : IExtractor
{
private Encoding _encoding;
private byte[] _row_delim;
private char _col_delim;
public SampleExtractor(Encoding encoding, string row_delim = "\n", char col_delim = '\t')
{
this._encoding = ((encoding == null) ? Encoding.UTF8 : encoding);
this._row_delim = this._encoding.GetBytes(row_delim);
this._col_delim = col_delim;
}
public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output)
{
string line;
//Read the input line by line
foreach (Stream current in input.Split(_encoding.GetBytes("\n")))
{
using (StreamReader streamReader = new StreamReader(current, this._encoding))
{
line = streamReader.ReadToEnd().Trim();
//Split the input by the column delimiter
string[] parts = line.Split(this._col_delim);
foreach (string part in parts)
{
string res = part;
if (res != null)
{
res = "\"" + res.Replace("\"", "\"\"") + "\"";
}
output.Set<string>(count, res);
}
}
yield return output.AsReadOnly();
}
yield break;
}
}
、
以下 DECLARE @storagePath string = @"E:\";
DECLARE @inputFileSetName string = @"dbo.file{*}.tsv";
DECLARE @outputFileName string = @"dbo.files.csv";
DECLARE @input string = String.Concat(@storagePath,
@inputFileSetName);
DECLARE @output = string.Concat(@storagePath, @outputFileName);
@searchlog =
EXTRACT Id string,
Name string,
Address string
FROM @input
USING new USQLApplication3.SampleExtractor(Encoding.UTF8);
@transactions =
SELECT *,
ROW_NUMBER() OVER(PARTITION BY Id ORDER BY Id DESC) AS
RowNumber_12345
FROM @searchlog;
@result =
SELECT EXTRACT Id,
Name,
Address
FROM @transactions
WHERE RowNumber_12345 == 1;
OUTPUT @result
TO @output
USING Outputters.Csv(encoding : Encoding.UTF8, quoting : false);
は、カスタム抽出のためのC#コードで、以下のスクリプトを用いた実施例以下、
を持っています複数のファイルを動的に作成出力?現時点では、1つのファイルしか作成していません。
編集:
私はまた、単一のu-SQLスクリプト内の複数の出力を試してみましたが、
@x = SELECT * FROM (VALUES("A", 10, 20), ("A", 11, 21), ("B", 10, 30), ("B", 100, 200)) AS T(name, value1, value2);
// Generate the script to do partitioned output based on name column:
DECLARE @out string ="E:/genscript.usql";
@stmts =
SELECT "@res=SELECT value1, value2 FROM @x WHERE name ==
\""+name+"\";
OUTPUT
@res TO \"E:/"+name+".csv\" USING Outputters.Csv();" AS output
FROM (SELECT DISTINCT name FROM @x) AS x;
OUTPUT @stmts TO @out
USING Outputters.Text(delimiter:' ', quoting:false);
@path = EXTRACT path string FROM @out USING Extractors.Text() ;
OUTPUT @path TO "E:/{*}.usql"
USING Outputters.Text(delimiter:' ', quoting:false);
しかし、それは次のエラーを示している、
重大度コード説明プロジェクトファイルの行の抑制状態 エラーE_CSC_USER_READFROMPREVIOUSOUTPUT:EXTRACTステートメントは、場所から読み取り/参照します。 n E:\ genscript.usqlは、以前のOUTPUT文のターゲットです。 説明: コンパイラは、単一ジョブ内の同じファイルからのOUTPUTをサポートしていません。 解決方法: ファイルへのOUTPUTに1つのジョブを作成し、同じファイルを読み取り/参照するために別のジョブを作成してください。
私は、単一のu-SQLまたはどのように私は、現在のU-SQLスクリプトから別のu-SQLスクリプトファイルへのアクセスからの出力の複数のファイルに今何をすべきでしょうか?
こんにちは、入力ファイルの行数に応じて動的に作成する必要があります。 – Arron
最初のサンプルでは、https://stackoverflow.com/questions/43227421/u-sql-split-a-csv-file-to-multiple-files-based-on-distinct-values-in-file/43243301# 43243301 – Arron
"/output/dynamic.usql"クエリが与えられていません – Arron