C# 如何使用U-SQL自定义提取器动态输出多个文件?
我创建了一个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
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();