尝试通过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节点。不幸的是,由于内部成千上万的物品(+产品的长名称)突破了限制,它没有帮助。
答案 0 :(得分:1)
首先,最小化您的XML或JSON。如果是XML,请检查名称空间。摆脱它们可能有所帮助(在我的情况下,它修复了大部分过长的价值)
第二个是编写自己的提取器(这并不难)。
我使用了两种方法,这里是我自己的parser的实现。这是用法example。请随意使用。
它非常通用,也支持XPath和命名空间。在性能方面,它与Microsoft的实现非常相似
在调查此问题期间,我发现两个解析器在处理许多小文件时工作速度极慢。
但是,制作太大的文件(~2GB)会导致OutOfMemory异常。我的假设是它发生的原因是文件被处理为Atomic(文件不是由250 MB块分配的,它们像CSV或TSV一样独立处理)。至于我的情况,文件大小200-250 MB是最佳的