我如何在 USQL UDO 中记录一些东西?

How can I log something in USQL UDO?

我有自定义提取器,我正在尝试从中记录一些消息。

我已经尝试过 Console.WriteLine 等明显的方法,但无法找到输出位置。但是,我在 adl://<my_DLS>.azuredatalakestore.net/system/jobservice/jobs/Usql/.../<my_job_id>/ 中发现了一些系统日志。

我怎样才能记录一些东西?是否可以在 Data Lake Store 或 Blob 存储帐户的某处指定日志文件?

好问题。我一直在问自己同样的事情。这是理论上的,但我认为它会起作用(如果我发现不同,我会更新)。

一种非常 hacky 的方法是,您可以将行插入到 table 中,并将您的日志消息作为字符串列。然后你可以 select 那些出来并根据一些 log_producer_id 列进行过滤。如果脚本的一部分有效,您还可以获得日志记录的好处,但后面的部分不会假设失败不会回滚。 Table 也可以在最后转储到文件中。

对于错误情况,您可以使用ADLA中的作业管理器打开作业图,然后查看作业输出。这些错误通常包含与数据相关的错误的详细信息(例如,错误文件中的行号和带有### 标记的问题的行的 octal/hex/ascii 转储)。

希望这个帮助ps,

J

ps。这实际上不是评论或答案,因为我没有工作代码。以上思路如有错误请反馈。

最近发布的 U-SQL 添加了 UDO 的诊断日志记录。请参阅发行说明 here

// Enable the diagnostics preview feature
SET @@FeaturePreviews = "DIAGNOSTICS:ON";


// Extract as one column
@input =
    EXTRACT col string
    FROM "/input/input42.txt"
    USING new Utilities.MyExtractor();


@output =
    SELECT *
    FROM @input;


// Output the file
OUTPUT @output
TO "/output/output.txt"
USING Outputters.Tsv(quoting : false);

这是我来自 UDO 的诊断线:

Microsoft.Analytics.Diagnostics.DiagnosticStream.WriteLine(System.String.Format("Concatenations done: {0}", i));

这是整个 UDO:

using System.Collections.Generic;
using System.IO;
using System.Text;
using Microsoft.Analytics.Interfaces;

namespace Utilities
{
    [SqlUserDefinedExtractor(AtomicFileProcessing = true)]
    public class MyExtractor : IExtractor
    {
        //Contains the row
        private readonly Encoding _encoding;
        private readonly byte[] _row_delim;
        private readonly char _col_delim;

        public MyExtractor()
        {
            _encoding = Encoding.UTF8;
            _row_delim = _encoding.GetBytes("\n\n");
            _col_delim = '|';
        }

        public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output)
        {
            string s = string.Empty;
            string x = string.Empty;
            int i = 0;

            foreach (var current in input.Split(_row_delim))
            {
                using (System.IO.StreamReader streamReader = new StreamReader(current, this._encoding))
                {
                    while ((s = streamReader.ReadLine()) != null)
                    {
                        //Strip any line feeds
                        //s = s.Replace("/n", "");

                        // Concatenate the lines
                        x += s;
                        i += 1;

                    }

                    Microsoft.Analytics.Diagnostics.DiagnosticStream.WriteLine(System.String.Format("Concatenations done: {0}", i));

                    //Create the output
                    output.Set<string>(0, x);
                    yield return output.AsReadOnly();

                    // Reset
                    x = string.Empty;

                }
            }
        }
    }
}

这些是我在以下目录中找到的结果:

/system/jobservice/jobs/Usql/2017/10/20.../diagnosticstreams