Являются ли Guids уникальными при использовании U-SQL Extractor? - PullRequest
0 голосов
/ 19 января 2019

Как указывают эти вопросы, Guid.NewGuid будет возвращать одно и то же значение для всех строк из-за принудительного детерминированного характера U-SQL, т. Е. Если он масштабируется, если элемент (вершина) нуждается в повторной попытке, он должен вернуть то же значение....

Guid.NewGuid () всегда возвращает один и тот же Guid для всех строк

auto_increment в U-SQL

Однако ... пример кода в официальной документации для User Defined Extractor целенаправленно использует Guid.NewGuid ().

Я не подвергаю сомнению правильность ответов на поставленные выше вопросы, так как онииз авторитетного источника (менеджер программ для u-sql, так что очень авторитетно!).Однако, что мне интересно, если действие использования Extractor означает, что NewGuid можно использовать как обычно?Это просто в выражениях c # в u-sql и пользовательских функциях, в которых NewGuid небезопасен?

[SqlUserDefinedExtractor(AtomicFileProcessing = true)]
public class FullDescriptionExtractor : IExtractor
{
     private Encoding _encoding;
     private byte[] _row_delim;
     private char _col_delim;

    public FullDescriptionExtractor(Encoding encoding, string row_delim = "\r\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("\r\n")))
         {
        using (System.IO.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);
             int count = 0; // start with first column
             foreach (string part in parts)
             {
    if (count == 0)
             {  // for column “guid”, re-generated guid
                 Guid new_guid = Guid.NewGuid();
                 output.Set<Guid>(count, new_guid);
             }
             else if (count == 2)
             {
                 // for column “user”, convert to UPPER case
                 output.Set<string>(count, part.ToUpper());

             }
             else
             {
                 // keep the rest of the columns as-is
                 output.Set<string>(count, part);
             }
             count += 1;
             }

         }
         yield return output.AsReadOnly();
         }
         yield break;
     }
}

https://docs.microsoft.com/en-us/azure/data-lake-analytics/data-lake-analytics-u-sql-programmability-guide#use-user-defined-extractors

...