張 zi 浩
发布于

使用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,以及下列规则。

  1. 当找到一个满足 XPath 表达式/prices/pricerecord 的元素时,检查子元素并且生成包含 itemnumber 变量值、一个 | 字符、price 变量值和一个新行的输出。
  2. 当找到一个元素时,将那个元素的内容存储在变量 itemnumber 中。
  3. 当找到一个 元素时,将那个元素的内容存储在变量 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 ',');
评论(4)
test