继上一章说到倒完数据后,这次需要把表结构及分区信息迁移到新集群上,并且load数据。
由于表个数及分区个数太多。所以必须通过元数据生成建表及分区语句。
元数据的配置在hive-site.xml
配置图如下:
此处使用pgsql来存储。
所有的元数据表如下:
其中比较重要的表为:
TBLS:存储所有表信息的表
PARTITION_KEYS:存储所有分区的key的表
COLUMNS_V2:存储表的所有列的表
PARTITIONS:存储所有分区信息的表
建立postgreSql中的group_concat函数
create aggregate array_accum (
sfunc = array_append,
basetype = anyelement,
stype = anyarray,
initcond = '{}'
);
CREATE OR REPLACE FUNCTION _group_concat(text, text)
RETURNS text AS $$
SELECT CASE
WHEN $2 IS NULL THEN $1
WHEN $1 IS NULL THEN $2
ELSE $1 operator(pg_catalog.||) ',' operator(pg_catalog.||) $2
END
$$ IMMUTABLE LANGUAGE SQL;
CREATE AGGREGATE group_concat (
BASETYPE = text,
SFUNC = _group_concat,
STYPE = text
);
建立加工信息的语句为:
SELECT T1."TBL_NAME", U.*, U1."COLUMNS", U1."COLUMNSTYPE", U2."PARTS"
FROM (SELECT T."TBL_ID",
group_concat(P."PKEY_NAME") AS "PKEYNAMES",
group_concat(P."PKEY_TYPE") AS "PKEYTYPES"
FROM "TBLS" T LEFT JOIN "PARTITION_KEYS" P
ON( T."TBL_ID" = P."TBL_ID")
GROUP BY T."TBL_ID") U,
(SELECT group_concat(V."COLUMN_NAME") AS "COLUMNS",
group_concat(V."TYPE_NAME") AS "COLUMNSTYPE",
T."TBL_ID"
FROM "COLUMNS_V2" V, "CDS" C, "SDS" S, "TBLS" T
WHERE V."CD_ID" = C."CD_ID"
AND C."CD_ID" = S."CD_ID"
AND S."SD_ID" = T."SD_ID"
GROUP BY T."TBL_ID") U1,
(SELECT T."TBL_ID", GROUP_CONCAT(P."PART_NAME") AS "PARTS"
FROM "TBLS" T LEFT JOIN "PARTITIONS" P
<span style="white-space:pre"> </span>ON(T."TBL_ID" = P."TBL_ID")
GROUP BY T."TBL_ID") U2,
"TBLS" T1
WHERE U."TBL_ID" = U1."TBL_ID"
AND U."TBL_ID" = T1."TBL_ID"
AND T1."TBL_ID" = U2."TBL_ID"
此语句可以取出每个表的所有列、分区等信息。
建立java工程,使用java来生成建表、分区、加载数据等sql语句。
工程已上传,地址为:
http://download.csdn.net/detail/jdzms23/8397409
中间没有对没有分区的表记录处理,需要处理,但是CSDN上这个文件不知道怎么改,CSDN真是体验不好。。
生成完sql后,执行完sql,即可把表结构及转移过来的数据全部迁移过来。