我正在为我们的内部文件格式(二进制序列化)实现自定义U-SQL Extractor。它在“原子”模式下运行良好:
[SqlUserDefinedExtractor(AtomicFileProcessing = true)]
public class BinaryExtractor : IExtractor
如果我关闭“Atomic”模式,看起来U-SQL正在将文件分割成一个随机位置(我想只需250MB块)。这对我来说是不可接受的。文件格式具有特殊的行分隔符。我可以在提取器中定义自定义行分隔符并为其启用并行性。从技术上讲,如果可以提供帮助,我可以将行分隔符更改为新分隔符。 任何人都可以帮我解决这个问题吗?
答案 0 :(得分:3)
该文件确实被拆分为块(我认为目前它是1 GB,但确切的值是实现定义的,并且可能因性能原因而改变)。
如果文件确实是行分隔的,并且假设该行的原始输入数据小于4MB,则可以使用UDO中的input.Split()函数将行拆分为行。如果原始输入数据跨越块边界(假设它小于4MB),则调用将自动处理该情况。
Here就是一个例子:
public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow outputrow)
{
// this._row_delim = this._encoding.GetBytes(row_delim); in class ctor
foreach (Stream current in input.Split(this._row_delim))
{
using (StreamReader streamReader = new StreamReader(current, this._encoding))
{
int num = 0;
string[] array = streamReader.ReadToEnd().Split(new string[]{this._col_delim}, StringSplitOptions.None);
for (int i = 0; i < array.Length; i++)
{
// DO YOUR PROCESSING
}
}
yield return outputrow.AsReadOnly();
}
}
请注意,您无法自行阅读块边界,并且应确保您的数据确实可以拆分为行。