Kettle付诸实践 03水经微图kml类型文件分类解析入库难点细节说明(完整流程实例云资源分享:包含sql+kjb+ktr+测试文件)
Posted シ風
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kettle付诸实践 03水经微图kml类型文件分类解析入库难点细节说明(完整流程实例云资源分享:包含sql+kjb+ktr+测试文件)相关的知识,希望对你有一定的参考价值。
资源连接:
链接:https://pan.baidu.com/s/18mbpnQBtwGiYISOwfkHwPw
提取码:xv0w
包含文件:
1.需求说明
一个与行政区划边界数据相关的应用,行政区划数据从水经微图
下载而来格式为kml
,需要把这些数据导入到数据库 GreenPlum
,并规范数据格式。源数据包含两类:
- _xx名称.txt(区域名称和中心点坐标)
- _xx边界.txt(区域名称和区域边界点坐标)
数据要转换成两类:
- 点
POINT(longitude,latitude)
- 多边形
POLYGON( POINT, POINT, POINT, ... )
2.流程实例
将kml
后缀批量修改为xml
的脚本:
# 在文件所在文件夹下创建 .txt 文件写入以下内容后修改文件后缀为 .bat
ren *.kml *.xml
2.1 获取数据并处理
中心点数据是很规范比较容易解析的,但是边界数据的存在多边界和单边界情况,此时的xml
标签不一致,所以需要分开进行解析:
难点 1️⃣ 标签路径不统一【必须分开进行解析】:
处理方法【将多边界数据以节点类型传递给下一个 xml文件输入组件】:
xml文件输入组件是可以接收流数据的,但是在提取成节点时会给节点添加标识 <MultiGeometry xmlns="http://www.opengis.net/kml/2.2">
需要处理掉xmlns="http://www.opengis.net/kml/2.2"
否则无法识别:
难点 2️⃣ 数据格式不好,需要转换:
每行的数据是longitude,latitude,altitude 经度,纬度,海拔
而最终需要的点格式为POINT(longitude,latitude)
边界格式为POLYGON( POINT, POINT, POINT, ... )
,思路是去掉换行然后对海拔数据,0
进行替换,去掉换行用正则表达式:
替换海拔,0
用SQL,以下SQL实现了边界数据字符串到多边形数据的格式转换:
POLYGON( '(' || TRIM ( TRAILING ',(' FROM REPLACE ( coordinates, ',0', '),(' ) ) )
2.2 数据入库中间表并转换数据格式
使用JOB可以控制SQL的执行顺序,由于用到了数据库的关联查询及数据结构转换所以创建了临时表:
所有使用到的SQL:
-- 存放边界数据
DROP TABLE IF EXISTS "public"."data_address_area";
CREATE TABLE "public"."data_address_area" (
"name" varchar(255) COLLATE "pg_catalog"."default",
"zone_name" varchar(255) COLLATE "pg_catalog"."default",
"coordinates" varchar(102400) COLLATE "pg_catalog"."default"
);
-- 存放区域名称
DROP TABLE IF EXISTS "public"."data_address_point";
CREATE TABLE "public"."data_address_point" (
"name" varchar(255) COLLATE "pg_catalog"."default",
"zone_name" varchar(255) COLLATE "pg_catalog"."default",
"coordinates" varchar(102400) COLLATE "pg_catalog"."default"
);
-- 存放格式化后的数据
DROP TABLE IF EXISTS "public"."data_address_geo";
CREATE TABLE "public"."data_address_geo" (
"id" varchar(16) COLLATE "pg_catalog"."default",
"pid" varchar(16) COLLATE "pg_catalog"."default",
"deep" varchar(1) COLLATE "pg_catalog"."default",
"name" varchar(64) COLLATE "pg_catalog"."default",
"ext_path" varchar(32) COLLATE "pg_catalog"."default",
"geo" point,
"polygon" polygon
);
-- 执行数据合并
INSERT INTO data_address_geo SELECT
pid.pid || ROW_NUMBER ( ) OVER ( ORDER BY point.NAME DESC ) AS "id",
pid.pid AS "pid",
'3' AS "deep",
point.NAME AS "name",
pid.ext_path || ' ' || point.NAME AS "ext_path",
point.point,
polygon.polygon
FROM
( SELECT NAME, zone_name, POINT( REPLACE ( coordinates, ',0', '' ) ) FROM data_address_point ) point,
( SELECT NAME, POLYGON( '(' || TRIM ( TRAILING ',(' FROM REPLACE ( coordinates, ',0', '),(' ) ) ) FROM data_address_area ) polygon,
( SELECT ID AS "pid", NAME, ext_path FROM data_administrative_divisions_geo ) pid
WHERE
point.NAME = polygon.NAME
AND point.zone_name = pid.NAME
-- 删除临时表
DROP TABLE "public"."data_address_area";
DROP TABLE "public"."data_address_point";
3.结果数据
表字段pid、deep、ext_path
是为了和之前的表进行合并形成树形结构,不需要的可以忽略:
4.技术总结
ETL 工具 Kettle 的功能是很强大的,读取数据、格式化数据、入库等等操作都是一般操作,有些复杂流程也可以拆分成多个简单流程,从而实现需求。这个实例就可以发现字符串替换操作用了很多次。
以上是关于Kettle付诸实践 03水经微图kml类型文件分类解析入库难点细节说明(完整流程实例云资源分享:包含sql+kjb+ktr+测试文件)的主要内容,如果未能解决你的问题,请参考以下文章