首页 文章

如何在USQL UDO中记录某些内容?

提问于
浏览
3

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

我尝试过像 Console.WriteLine 这样的显而易见的东西,但无法找到输出的位置 . 但是,我在 adl://<my_DLS>.azuredatalakestore.net/system/jobservice/jobs/Usql/.../<my_job_id>/ 中找到了一些系统日志 .

我该如何记录?是否可以在Data Lake Store或Blob存储帐户的某处指定日志文件?

2 回答

  • 5

    最近发布的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

    diagnostic output

  • 2

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

    一种非常hacky的方式是您可以将行插入到表中,并将日志消息作为字符串列 . 然后,您可以根据某些log_producer_id列选择那些并过滤 . 如果脚本的一部分工作,您也可以获得日志记录的好处,但是后面的部分不会假设故障不会回滚 . 表可以在结尾转储到文件中 .

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

    希望这可以帮助,

    Ĵ

    PS . 这不是评论或答案,因为我没有工作代码 . 如果上述想法错误,请提供反馈 .

相关问题