基于XQuery从XML源抽取数据加载至Netezza数据库的入门指导需求
入门实现:用XQuery抽取XML字段并加载至Netezza
1. 先处理XML命名空间
你的XML包含wd命名空间(urn:com.workday.report/BCF-Termination-Details),XQuery必须先声明该命名空间才能正确定位节点,否则会出现元素匹配失败的问题。
2. 基础XQuery抽取示例
以下XQuery脚本会遍历所有wd:Report_Entry节点,抽取核心业务字段,支持单条或多条记录的XML文件:
declare namespace wd = "urn:com.workday.report/BCF-Termination-Details"; // 遍历每条记录,抽取指定字段 for $entry in /wd:Report_Data/wd:Report_Entry return concat( $entry/wd:Worker/wd:Associate_ID/text(), ",", $entry/wd:Worker/wd:Total_Base_Pay_Amount/text(), ",", $entry/wd:Worker/wd:Total_Base_Pay_Currency/wd:ID[@wd:type="Currency_ID"]/text(), ",", $entry/wd:Hire_Date/text(), ",", $entry/wd:Termination_Date/text(), ",", $entry/wd:Termination_Category/text(), ",", $entry/wd:Length_of_Service_in_Days/text(), ",", $entry/wd:workdayID/text() )
如果需要输出带表头的CSV格式(方便后续数据库加载),可以调整脚本:
declare namespace wd = "urn:com.workday.report/BCF-Termination-Details"; // 输出CSV表头 "Associate_ID,Base_Pay_Amount,Currency,Hire_Date,Termination_Date,Termination_Category,Service_Days,WorkdayID" , // 遍历生成数据行 for $entry in /wd:Report_Data/wd:Report_Entry return concat( $entry/wd:Worker/wd:Associate_ID/text(), ",", $entry/wd:Worker/wd:Total_Base_Pay_Amount/text(), ",", $entry/wd:Worker/wd:Total_Base_Pay_Currency/wd:ID[@wd:type="Currency_ID"]/text(), ",", $entry/wd:Hire_Date/text(), ",", $entry/wd:Termination_Date/text(), ",", $entry/wd:Termination_Category/text(), ",", $entry/wd:Length_of_Service_in_Days/text(), ",", $entry/wd:workdayID/text() )
3. 执行XQuery抽取数据
使用开源XQuery处理器Saxon HE(免费版)执行脚本,步骤如下:
- 下载Saxon HE并解压
- 用命令行执行:
java -jar saxon-he-xxx.jar -s:your_input.xml -q:extract_fields.xq -o:output.csv
参数说明:
-s: 指定输入XML文件路径-q: 指定你的XQuery脚本文件-o: 指定输出CSV文件路径
4. 将CSV加载至Netezza
步骤1:创建目标表
先在Netezza中创建匹配字段的表:
CREATE TABLE termination_details ( associate_id VARCHAR(20), base_pay_amount NUMERIC, currency VARCHAR(3), hire_date TIMESTAMP, termination_date TIMESTAMP, termination_category VARCHAR(50), service_days INT, workday_id VARCHAR(50) );
步骤2:导入数据
方法1:用nzload命令行工具
nzload -db your_database -table termination_details -delim ',' -filename output.csv -skipRows 1
-skipRows 1: 跳过CSV的表头行
方法2:通过外部表导入
CREATE EXTERNAL TABLE ext_termination_details ( associate_id VARCHAR(20), base_pay_amount NUMERIC, currency VARCHAR(3), hire_date TIMESTAMP, termination_date TIMESTAMP, termination_category VARCHAR(50), service_days INT, workday_id VARCHAR(50) ) USING ( DATAOBJECT('/path/to/output.csv') DELIMITER ',' SKIPROWS 1 ); -- 将外部表数据插入目标表 INSERT INTO termination_details SELECT * FROM ext_termination_details;
5. 大量XML记录的处理注意事项
- 若XML文件体积过大,使用Saxon的流式处理模式避免内存溢出
- 可将大XML拆分为多个小文件,分批处理后合并CSV再导入数据库
内容的提问来源于stack exchange,提问作者ImSahil
相关产品推荐
相关产品推荐

