Hadoop 从零开始学习系列-hive从元数据生成表结构、分区等建表语句

时间:2020-12-18 14:52:00

继上一章说到倒完数据后,这次需要把表结构及分区信息迁移到新集群上,并且load数据。

由于表个数及分区个数太多。所以必须通过元数据生成建表及分区语句。


元数据的配置在hive-site.xml

配置图如下:

Hadoop 从零开始学习系列-hive从元数据生成表结构、分区等建表语句

此处使用pgsql来存储。

所有的元数据表如下:

Hadoop 从零开始学习系列-hive从元数据生成表结构、分区等建表语句

其中比较重要的表为:

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,即可把表结构及转移过来的数据全部迁移过来。