Как указывают эти вопросы, 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