2017-07-19 10 views
1

複数のファイルからデータを読み取る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#コードで、以下のスクリプトを用いた実施例以下、

U-SQL Output in Azure Data Lake

を持っています複数のファイルを動的に作成出力?現時点では、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スクリプトファイルへのアクセスからの出力の複数のファイルに今何をすべきでしょうか?

答えて

1

は、あなたは、単に例えば

OUTPUT @result1 
TO @output1 
USING Outputters.Csv(encoding : Encoding.UTF8, quoting : false); 

OUTPUT @result2 
TO @output2 
USING Outputters.Csv(encoding : Encoding.UTF8, quoting : false); 
... 

U-SQLを直接ダイナミックU-SQLをサポートしていませんが、それを行うための方法があり、複数のOUTPUTのコマンドを使用することができます。それを行う2つの例は、herehereです。

+1

こんにちは、入力ファイルの行数に応じて動的に作成する必要があります。 – Arron

+0

最初のサンプルでは、​​https://stackoverflow.com/questions/43227421/u-sql-split-a-csv-file-to-multiple-files-based-on-distinct-values-in-file/43243301# 43243301 – Arron

+0

"/output/dynamic.usql"クエリが与えられていません – Arron

関連する問題