hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能;可以将SQL语句转换为MapReduce任务运行,通过自己的SQL查询分析需要的内容,这套SQL简称Hive SQL。
其实不同的数据库,比如oracle和mysql在sql语句上也有细微差别。Hive-sql与SQL基本上一样。一般情况下大胆使用SQL语句的,如果遇到不对的,再查;
hive sql固有的一些特点入下:
Waterdrop是为开发人员和数据库管理人员提供的数据库管理工具,它可进行跨平台管理,可作为Inceptor SQL客户端,除了Inceptor还支持并兼容其余多种数据库。它具有有四个功能模块:Database Navigator、SQL Editor、SQL Executor、Data Viewer/Eidtor,分别用来帮助用户实现数据库管理、SQL编 辑、SQL执行、数据操作这四项功能。总的来说,就是一个数据库管理软件,类似于navicat以及debaver等可视化管理工具。
SELECT aa.uid,sum(aa.addr_no)
FROM stg.t_018_doc_address_spec_organization AS aa
GROUP BY aa.uid
输出结果为:
SELECT aa.uid,sum(aa.addr_no) over (partition by aa.uid order BY aa.addr_no) as sum
FROM stg.t_018_doc_address_spec_organization AS aa
综上所述,可以理解为group by分组聚合结果唯一,partition by分组聚合结果显示全部行数据的记录记过,sum函数表现为累加求和。
partition by 通常和row_number() over一起使用,可以对分组内记录进行按照某一字段排序进行编号。
比如:
SELECT aa.uid,aa.org_name,aa.addr_no,row_number() over (partition by aa.uid order BY aa.才o) as rn
FROM stg.t_018_doc_address_spec_organization AS aa
按uid分组,按照addr_no地址序号排序进行编号,执行结果如下:
进一步结合where筛选可以实现单字段去重。
主要目标是从五张表中关联出需要的字段。
进一步利用uid字段来关联五张表,从而得到需求字段:
--创建论文id机构对应表
CREATE TABLE stg.t_018_doc_uid_organization
AS
(
select t.uid,t.org_name,t.addr_no
from
(SELECT aa.uid,aa.org_name,aa.addr_no,row_number() over (partition by aa.uid order BY aa.addr_no) as rn
FROM stg.t_018_doc_address_spec_organization AS aa ) AS t
WHERE t.rn =1
);
--select count(distinct t.uid) from stg.t_018_doc_address_spec_organization AS t
--创建论文作者对应表
CREATE TABLE stg.t_018_doc_author
AS
(
SELECT aa.uid,collect_list(aa.display_name) AS author
FROM stg.t_018_doc_name AS aa group by aa.uid
);
--创建论文关键词对应表
CREATE TABLE stg.t_018_doc_keyword2
AS
(
SELECT aa.uid,collect_list(aa.doc_keyword) AS keyword
FROM stg.t_018_doc_keyword AS aa group by aa.uid
);
--创建论文摘要对应表
CREATE TABLE stg.t_018_doc_abstract
AS
(
SELECT aa.uid,collect_list(aa.abstract_text) AS abstract
FROM stg.t_018_doc_abstract_text_paragraph AS aa group by aa.uid
);
--关联五张表得到消歧数据表
CREATE TABLE stg.t_018_sci_disamb
AS
(
SELECT aa.first_author_full_name,aa.uid,dd.author,aa.title,bb.abstract,cc.keyword,ee.org_name,aa.pubyear,aa.source
FROM stg.t_018_doc_meta AS aa
LEFT JOIN stg.t_018_doc_abstract AS bb
ON aa.uid=bb.uid
LEFT JOIN stg.t_018_doc_keyword2 AS cc
ON aa.uid = cc.uid
LEFT JOIN stg.t_018_doc_author AS dd
ON aa.uid = dd.uid
LEFT JOIN stg.t_018_doc_uid_organization AS ee
ON aa.uid = ee.uid
);
--将字符数组字段,按照分隔符转为字符串字段(否则无法成功导出)
CREATE TABLE stg.t_018_sci_disamb_string
AS
(
SELECT aa.first_author_full_name,aa.uid,concat_ws('|',aa.author) AS author,aa.title,concat_ws(',',aa.abstract) AS abstract,concat_ws(',',aa.keyword) AS keyword,aa.org_name,aa.pubyear,aa.source
from stg.t_018_sci_disamb AS aa
);
运行上述sql脚本,可以得到最终最终筛选的结果表如下: