如何为自定义U-SQL Extractor启用并行性

时间:2017-03-13 16:35:35

标签: azure-data-lake u-sql

我正在为我们的内部文件格式(二进制序列化)实现自定义U-SQL Extractor。它在“原子”模式下运行良好:

[SqlUserDefinedExtractor(AtomicFileProcessing = true)]
public class BinaryExtractor : IExtractor

如果我关闭“Atomic”模式,看起来U-SQL正在将文件分割成一个随机位置(我想只需250MB块)。这对我来说是不可接受的。文件格式具有特殊的行分隔符。我可以在提取器中定义自定义行分隔符并为其启用并行性。从技术上讲,如果可以提供帮助,我可以将行分隔符更改为新分隔符。 任何人都可以帮我解决这个问题吗?

1 个答案:

答案 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();
    }
}

请注意,您无法自行阅读块边界,并且应确保您的数据确实可以拆分为行。