如何在Snowflake中获取大型XML的XML头标签数据,同时使用STRINE_OUTER_ELEMENT=TRUE [英] how to get xml header tag data in snowflake for a large xml , while using STRIP_OUTER_ELEMENT = TRUE

查看:28
本文介绍了如何在Snowflake中获取大型XML的XML头标签数据,同时使用STRINE_OUTER_ELEMENT=TRUE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用此代码在暂存到Snowflake中获取大量XML数据, 为此,我必须使用STRINE_OUTER_ELEMENT=TRUE,否则会出现错误:

分析xml时出错:文档太大,最大大小为16777216字节

COPY INTO SAMPLE_DB.SAMPLE_SCH.T_TABLE (CATALOG_XML)
FROM @META_DB.CONFIG.STAGESNOWFLAKE/catalogmain.xml
FILE_FORMAT=(TYPE=XML STRIP_OUTER_ELEMENT = TRUE) 
ON_ERROR='CONTINUE';

在此XML上,非常大

<catalog xmlns="http://www.demandware.com/xml/impex/catalog/2006-10-31" catalog-id="catalog1">
    <product product-id="prod1">
     ..
     ..
     ..
    </product>
</catalog>

我得到的结果是 AS CATALOG_XML:(未获取目录标记数据)

<product product-id="prod1">
 ..
 ..
 ..
</product>

我需要从此XML获取目录id,有什么方法可以获取吗?

xml

使用STRIP_OUTER_ELEMENT = FALSE,整个推荐答案文档将被读入单个值。无论在COPY INTO语句或direct file query中转换为VARCHAR或VARIANT类型,都不能绕过Snowflake中针对这些数据类型的16 MiB大小限制

您可以尝试将XML文件拆分成大小易于管理的片段,保留父标记,然后上载承载相同数据量的较小文件。

例如,Node.js中的以下javascript程序可以将文件分解为每个文件固定数量的product元素while preserving the outer catalog element in each file。这会生成一个细分文件目录,可以加载和查询这些文件,而不会达到16 MiB的限制。

~> mkdir /tmp/xsplt /tmp/split_files && cd /tmp/xsplt
~> npm init && npm install xmlsplit

~> cat > splitter.js << EOF
var xs = require('xmlsplit')
var fs = require('fs')

// Split into 500 product element data per document
var xmlsplit = new xs(batchSize=500)
var inputStream = fs.createReadStream("/tmp/large-input.xml")

var counter = 1;
inputStream.pipe(xs).on('data', function(data) {
    var xmlDocument = data.toString()
    fs.writeFile(
        `/tmp/split_files/output-part-${counter}.xml`,
        xmlDocument,
        (err) => { if (err) { console.log(err) } })
    counter += 1
})
EOF

~> node splitter.js

# Original input line count
~> wc -l /tmp/large-input.xml
500002
# Lines per split file
~> wc -l /tmp/split_files/output-part-1.xml
502
# No. of smaller files
~> ls /tmp/split_files/ | wc -l 
1000

其他替代方法可以是尝试使用CSV export of the data而不是XML,或者在将数据加载到Snowflake之前执行本地文件格式转换。

P.S.有关加载和查询拆分文件的帮助,请查看earliest revision of this answer

这篇关于如何在Snowflake中获取大型XML的XML头标签数据,同时使用STRINE_OUTER_ELEMENT=TRUE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆