E_RUNTIME_USER_STRINGTOOBIG xml pasing

时间:2018-05-07 17:47:14

标签: xml azure azure-data-lake u-sql

尝试通过Azure Data Lake工作加载XML我使用Microsoft.Analytics.Samples.Formats

面临E_RUNTIME_USER_STRINGTOOBIG的难以解决的问题

问题在于XmlDomExtractor是从同一个XML文件(一对多)内部加入(或者更确切地说)应用元素的唯一方法。

@xml =
EXTRACT Id string,
        //...
        Products string
FROM @"/pathToXml.xml"
USING new Microsoft.Analytics.Samples.Formats.Xml.XmlDomExtractor("contract",
      new SQL.MAP<string, string>{
      {"id", "Id"},
      //...
      // this is actually a node that may contain thousand of child node
      {"products", "Products"}
      });

应用:

@data = SELECT c.Id,
        //....
        pp.ProductSid, 
        // ... other product properties
    FROM @prepareData AS c
    OUTER APPLY
        new Microsoft.Analytics.Samples.Formats.Xml.XmlApplier ("Products","/",new SQL.MAP<string, string>{
      {"/abc/p/s", "ProductSid"},
      //....
      }) AS pp(
            ProductSid string, 
            /*....*/
              );

代码的完整版本为here

我试图通过用字母替换名称来最小化我的XML节点。不幸的是,由于内部成千上万的物品(+产品的长名称)突破了限制,它没有帮助。

1 个答案:

答案 0 :(得分:1)

解决方案

到目前为止,还没有真正的解决方案可以解决这个问题。但我发现只有两种方法可以解决:

首先,最小化您的XML或JSON。如果是XML,请检查名称空间。摆脱它们可能有所帮助(在我的情况下,它修复了大部分过长的价值)

第二个是编写自己的提取器(这并不难)。

我使用了两种方法,这里是我自己的parser的实现。这是用法example。请随意使用。

它非常通用,也支持XPath和命名空间。在性能方面,它与Microsoft的实现非常相似

效果

在调查此问题期间,我发现两个解析器在处理许多小文件时工作速度极慢。

但是,制作太大的文件(~2GB)会导致OutOfMemory异常。我的假设是它发生的原因是文件被处理为Atomic(文件不是由250 MB块分配的,它们像CSV或TSV一样独立处理)。至于我的情况,文件大小200-250 MB是最佳的