【问题标题】:U-SQL: Array cannot be null using Avro ExtractorU-SQL:使用 Avro 提取器的数组不能为空
【发布时间】:2017-10-19 14:57:40
【问题描述】:

使用 Avro Extractor 数组不能为空

使用 EventHub 并捕获到 Blob 存储我有一个基于 AvroSamples 的函数,它试图转换文件。

这是我的 U-SQL 脚本:

REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [log4net];
REFERENCE ASSEMBLY [Avro]; 
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];


DECLARE @ABI_DATE string = "2017/10/17/"; //replace by ADF pipeline
DECLARE @input_file string = "wasb://archive@sa/namespace/eh/{*}/" + @ABI_DATE +"{*}/{*}/{*}";
DECLARE @output_file string = @"/output/" + @ABI_DATE + "extract.csv";


@rs =
EXTRACT
        SequenceNumber long
        ,EnqueuedTimeUtc string
        ,Body byte[]
FROM @input_file
USING new Microsoft.Analytics.Samples.Formats.ApacheAvro.AvroExtractor(@"
    {
        ""type"":""record"",
        ""name"":""EventData"",
        ""namespace"":""Microsoft.ServiceBus.Messaging"",
        ""fields"":[
            {""name"":""SequenceNumber"",""type"":""long""},
            {""name"":""Offset"",""type"":""string""},
            {""name"":""EnqueuedTimeUtc"",""type"":""string""},
            {""name"":""SystemProperties"",""type"":{""type"":""map"",""values"":[""long"",""double"",""string"",""bytes""]}},
            {""name"":""Properties"",""type"":{""type"":""map"",""values"":[""long"",""double"",""string"",""bytes""]}},
            {""name"":""Body"",""type"":[""null"",""bytes""]}
        ]
    }
");

@cnt =
SELECT 
    SequenceNumber
    ,Encoding.UTF8.GetString(Body) AS Json   //THIS LINE BREAKS !!!!
    ,EnqueuedTimeUtc
FROM @rs;

OUTPUT @cnt TO @output_file USING Outputters.Text();

如果我运行相同的提取器但注释掉 Body 字段,它会按预期工作。

这是错误:

用户表达式的内部异常:数组不能为空。范围 名称:字节当前行转储:序列号:4622 EnqueuedTimeUtc:NULL 正文:NULL

计算表达式 Encoding.UTF8.GetString(Body) 时出错

【问题讨论】:

    标签: azure-data-lake


    【解决方案1】:

    弗洛里安·曼德,给了我解释:

    提取器正常工作,您只是传递空值 (故意,因为它在模式中)在一个方法中 (Encoding.GetString) 不接受 null 作为输入。在你最新的 解决方案,但是,您将丢失所有没有正文的记录。 这是一个非技术性的决定,无论这是否合适。

    所以这是修复它的方法(使用 WHERE 子句)

    @cnt =
    SELECT 
        SequenceNumber
        ,Encoding.UTF8.GetString(Body) AS Json
        ,EnqueuedTimeUtc
    FROM @rs
    WHERE Body != null;
    

    【讨论】:

      猜你喜欢
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多