Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用U-SQL自定义提取器动态输出多个文件?_C#_Azure_Azure Data Lake_U Sql - Fatal编程技术网

C# 如何使用U-SQL自定义提取器动态输出多个文件?

C# 如何使用U-SQL自定义提取器动态输出多个文件?,c#,azure,azure-data-lake,u-sql,C#,Azure,Azure Data Lake,U Sql,我创建了一个U-SQL查询,它从多个文件中读取数据。现在我必须将数据输出到其他文件夹中的多个文件中。我有下面的例子 使用下面的脚本 DECLARE @storagePath string = @"E:\"; DECLARE @inputFileSetName string = @"dbo.file{*}.tsv"; DECLARE @outputFileName string = @"dbo.files.csv"; DECLA

我创建了一个U-SQL查询,它从多个文件中读取数据。现在我必须将数据输出到其他文件夹中的多个文件中。我有下面的例子

使用下面的脚本

        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#代码

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;
    }
}
但它显示了以下错误:

严重性代码说明项目文件行抑制状态 错误E_CSC_USER_READFROMPREVIOUSOUTPUT:EXTRACT语句从位置E:\genscript.usql读取/引用,该位置是先前输出语句的目标。 说明: 编译器不支持在单个作业中输出到同一文件,然后读取/引用同一文件。 决议: 请创建一个作业以输出到文件,并创建另一个作业以读取/引用同一文件


我现在应该如何从一个u-sql输出多个文件,或者如何从当前u-sql脚本访问另一个u-sql脚本文件?例如,您可以简单地使用多个
输出
命令

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,但有几种方法可以做到这一点。两种示例方法是和。

自2020年起,这是在功能预览标志
DataPartitionedOutput:on

SET @@FeaturePreviews = "DataPartitionedOutput:on";


@rows =
EXTRACT 
Firstname string,
Lastname string,
Score string
FROM "/input/a.csv"
USING Extractors.Csv(skipFirstNRows:1);


OUTPUT @rows
TO @"output/{Score}.csv"
USING Outputters.Csv();

您好,我必须根据输入文件中的行数动态创建它。在第一个示例中,没有向它们提供“/output/dynamic.usql”查询它将如何处理数据arron:示例中的脚本正在创建另一个U-SQL脚本。因此,您可以通过先运行生成脚本,然后下载生成的脚本(例如dynamic.usql),然后运行该脚本来协调执行。请注意,输出到多个文件的功能仍在开发中。您可能需要创建一个一次只执行一条记录的作业。然后参数化它,对于每个记录,您都将有一个输出
SET @@FeaturePreviews = "DataPartitionedOutput:on";


@rows =
EXTRACT 
Firstname string,
Lastname string,
Score string
FROM "/input/a.csv"
USING Extractors.Csv(skipFirstNRows:1);


OUTPUT @rows
TO @"output/{Score}.csv"
USING Outputters.Csv();