使用gpfdist导入XML和JSON数据到OushuDB
使用 gpfdist 导入 XML 数据到 OushuDB
OushuDB 数据库的数据装载器 gpfdist 为装载 XML 数据到表中提供了转换特性。下面介绍如何使用 gpfdist 导入数据到 OushuDB。
1、准备 XML 文件
下面的 XML 文件 prices.xml 是一个简短的包含价格记录的文件。每一个价格记录包含两个域:一个项编号和一个价格。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<prices>
<pricerecord>
<itemnumber>708421</itemnumber>
<price>19.99</price>
</pricerecord>
<pricerecord>
<itemnumber>708466</itemnumber>
<price>59.25</price>
</pricerecord>
<pricerecord>
<itemnumber>711121</itemnumber>
<price>24.99</price>
</pricerecord>
</prices>
2、编写转换规则
对于 XML 转换,基于项目的目标和范围选择一种如 XSLT、Joost(STX)、Java、Python 或者 Perl 的技术。
下面的 input_transform.stx 的 STX 转换完成了数据转换。使用了 Joost,必须安装 Joost STX 引擎。需要依赖 joost.jar
<?xml version="1.0"?>
<stx:transform version="1.0"
xmlns:stx="http://stx.sourceforge.net/2002/ns"
pass-through="none">
<!-- declare variables -->
<stx:variable name="itemnumber"/>
<stx:variable name="price"/>
<!-- match and output prices as columns delimited by | -->
<stx:template match="/prices/pricerecord">
<stx:process-children/>
<stx:value-of select="$itemnumber"/>
<stx:text>|</stx:text>
<stx:value-of select="$price"/> <stx:text>
</stx:text>
</stx:template>
<stx:template match="itemnumber">
<stx:assign name="itemnumber" select="."/>
</stx:template>
<stx:template match="price">
<stx:assign name="price" select="."/>
</stx:template>
</stx:transform>
这个 STX 转换声明了两个临时变量 itemnumber 和 price,以及下列规则。
- 当找到一个满足 XPath 表达式/prices/pricerecord 的元素时,检查子元素并且生成包含 itemnumber 变量值、一个 | 字符、price 变量值和一个新行的输出。
- 当找到一个元素时,将那个元素的内容存储在变量 itemnumber 中。
- 当找到一个 元素时,将那个元素的内容存储在变量 price 中。
3、编写转换脚本
使用了上一步骤的 input_transform.stx 转换规则。依赖 joost.jar 完成转换。
vi input_transform.sh
#!/bin/bash
# input_transform.sh - sample input transformation,
# demonstrating use of Java and Joost STX to convert XML into
# text to load into Greenplum Database.
# java arguments:
# -jar joost.jar joost STX engine
# -nodecl don't generate a <?xml?> declaration
# $1 filename to process
# input_transform.stx the STX transformation
#
# the AWK step eliminates a blank line joost emits at the end
java -jar /home/gpadmin/joost.jar -nodecl $1 input_transform.stx | awk 'NF>0'
4、编写 gpfdist 配置
config.yaml 是 gpfdist 可读取的配置文件。调用上一步骤的 input_transform.sh
vi config.yaml
---
VERSION: 1.0.0.1
TRANSFORMATIONS:
prices_input:
TYPE: input
COMMAND: /bin/bash input_transform.sh %filename%
5、启动 gpfdist
启动 gpfdist 需要-c 指定 config.yaml。
gpfdist -d /home/gpadmin -p 8081 -c config.yaml -l /home/gpadmin/gpfdist.log
6、创建外部表
外部表的 url 要加上#transform=prices_input 参数,指定 config.yaml 定义的 TRANSFORMATION 名
create readable external table prices(itemnumber text,price text) location('gpfdist://192.168.202.101:8081/test2.xml#transform=prices_input') FORMAT 'TEXT' ( DELIMITER '|' NULL ' ');
使用 gpfdist 导入 JSON 数据到 OushuDB
原理和导入 XML 是一样的,转换数据格式使用 jq 工具
1、安装 jq
# 第一种方式
yum install epel-release
yum install jq
# 第二种方式
git clone https://github.com/stedolan/jq.git
cd jq
autoreconf -i
./configure –disable-maint ainer-mode
make
sudo make install
2、准备 JSON
{ "id": 1, "type": "home", "address": { "city": "Boise", "state": "Idaho" } }
{ "id": 2, "type": "fax", "address": { "city": "San Francisco", "state": "California" } }
3、编写 config.yaml
VERSION: 1.0.0.1
TRANSFORMATIONS:
extract:
TYPE: input
COMMAND: /usr/bin/jq -c -M -r '[.id, .type, .address.city]|@csv' %filename%
4、创建外部表
启动 gpfdist 参考上文导入 XML 文件。
create external table ext_json (id int, type text, city text) location ('gpfdist://192.168.202.101:8081/test.json#transform=extract') format 'text' (DELIMITER ',');