降龙十八掌

目录

大数据:

1 HIVE:

1.1 HIVE QL

1.1.1 创建表

1.1.2 更新表

1.1.3 常用语句

1.2 hive参数配置


大数据:

1 HIVE:

1.1 HIVE QL

        DDL中常用的命令有:create,drop,alter,truncate和rename等等。而,DML中常用的命令有:insert,update,delete和select等等

1.1.1 创建表

  • 创建一张内部分区表
CREATE TABLE ads_ql_jg_jhxm_1day (
    xzqhdm string comment '行政区划代码' ,
    sscsdm string comment '所属城市代码' ,
    yskzjbm string comment '原始库主键编码' ,
    xmmc string comment '项目名称' ,
    xmlx string comment '项目类型' ,
    zgdw string comment '主管单位' ,
    xmnr string comment '项目内容' ,
    jhnd int comment '计划年度' ,
    xmjszq int comment '项目建设周期' ,
    xmtze decimal(13,3) comment '项目投资额' ,
    bz string comment '备注' ,
    sjtbzt string comment '数据同步状态' ,
    sjtbsj timestamp comment '数据同步时间' ,
    kjxx string comment '空间信息' 
)
COMMENT '桥梁计划项目属性结构表'
partitioned by (partition_time string) 
ROW FORMAT DELIMITED FIELDS 
TERMINATED BY ',' stored as orc;
  • 创建外部表
CREATE EXTERNAL TABLE page_view
(
viewTime	  INT, 
userid		  BIGINT, 
page_url	  STRING, 
referrer_url  STRING, 
ip 			  STRING COMMENT 'IP Address of the User', 
country 	  STRING COMMENT 'country of origination'
) 
COMMENT 'page_view' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\054' --指定字段分隔符,这里我们使用逗号分隔符
--FIELDS TERMINATED BY '\t':制表符(\t)作为字段分隔符。
STORED AS TEXTFILE 
LOCATION ''; 
  • 创建分桶表

CREATE TABLE par_table
(
	viewTime	 INT, 
	userid		 BIGINT, 
	page_url	 STRING, 
	referrer_url STRING, 
	ip			 STRING COMMENT 'IP Address of the User'
) 
COMMENT 'par_table' 
PARTITIONED BY(date STRING, pos STRING) --2级分区
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS --根据 userid 列进行分桶,并在每个桶内按照 viewTime 列进行排序
ROW FORMAT DELIMITED '\t'
FIELDS TERMINATED BY '\n' 
STORED AS ORC; 

1.1.2 更新表

--删除表
DROP TABLE table_name;

--删除多个分区
ALTER TABLE table_name DROP PARTITION (statis_date='20230701'), PARTITION (statis_date='20230702');
--删除一个分区范围
--删除 2023-07-01 到 2023-07-10 的日分区
ALTER TABLE table_name DROP PARTITION (statis_date BETWEEN '20230701' AND '20230710');

--重命名表
ALTER TABLE table_name RENAME TO new_table_name;

--修改列的名字、类型、位置、注释 
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name] 
--这个命令可以允许改变列名、数据类型、注释、列位置或者它们的任意组合,例子如下
--将dwd_test_d 表中的orderid 字段修改为order_id,并把字段类型和注释更新成新的
ALTER TABLE dwd_test_d CHANGE COLUMN orderid order_id string comment '订单号';

1.1.3 常用语句

--新增字段
ALTER TABLE employee ADD COLUMNS (salary double COMMENT '员工薪水');


--复制一个空表 
CREATE TABLE empty_key_value_store LIKE key_value_store;


--插入数据的语句
INSERT INTO table VALUES (value1, value2, ...),(value1, value2, ...), ...


​--往分区表写入的语句
insert overwrite table dwd_test_d partition (partition_time='20230524')
select
...

from
table_name


--快速创建备份表
create table ads_ql_jg_wqzzjl_full_20230711 stored as orc as
select
*
from
ads_ql_jg_wqzzjl_full


--hive取昨天日期
regexp_replace(substr(date_sub(FROM_UNIXTIME(UNIX_TIMESTAMP()),1),1,10),'-','')
--hive取明天日期
regexp_replace(substr(date_add(FROM_UNIXTIME(UNIX_TIMESTAMP()),1),1,10),'-','')
--时间戳
from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss') as etl_time
--hive取当前日期
DATE_FORMAT(CURRENT_DATE(), 'yyyyMMdd')


--开窗函数
row_number() over( partition by  a.id, a.create_date order by etl_time desc) as rn

​
--行转列
select 
    分类字段,
    concut_ws('',collet_set (合并字段)) as 别名 
from table_name
group by 
分类字段

--列转行
select 
    字段,
    字段别名
from table_name
lateral view explode (split(拆分字段,分隔符)) 表别名 as 字段别名

1.1.4 DWD表做更新插入语句

每天把分区表中新增和修改的数据插入到DWD表中

insert overwrite table dwd_ps_jg_xqrb_full
select
  sscsbm,
  sscs,
  xzqhdm,
  xzqhmc,
  ...
  ...
  ...
  from_unixtime(unix_timestamp(), 'yyyy-MM-dd HH:mm:ss') as etl_time --etl处理时间
from
  (
    select
      a.*,
      row_number() over(partition by a.jyjlbm,a.jyxxbm order by etl_time desc) as rn
    from
      (
        select
          sscsbm,
          sscs,
          xzqhdm,
          xzqhmc,
		  ...
		  ...
		  ...
          etl_time --etl处理时间
        from
          dwd_ps_jg_xqrb_full
        union all
        select
          sscsbm,
          sscs,
          xzqhdm,
          xzqhmc,
		  ...
		  ...
		  ...
          from_unixtime(unix_timestamp(), 'yyyy-MM-dd HH:mm:ss') as etl_time --etl处理时间
        from
          mid_dwd_ps_jg_xqrb_inc
        where
          partition_time = '${lastDay}'
      ) a
  ) b
where
  rn = 1
  • 1.2 hive参数配置

set mapred.job.name=任务名称;--设置MR任务名称

--2个分桶表JOIN设置参数--start
--执行Join操作时,基于排序后的数据进行高效的连接。
set hive.auto.convert.sortmerge.join=true;
--基于分桶的Map Join通过将数据按照相应的分桶策略分配到不同的桶中,然后在执行 Join 操作时,只处理涉及到的特定桶的数据,避免了全表扫描的开销,提高了查询效率。
set hive.optimize.bucketmapjoin = true;
--Sort-Merge Join 通过对参与 Join 操作的表按照 Join 键进行排序,从而实现高效的连接操作。它可以避免传统的 Hash Join 算法所带来的内存开销和数据倾斜的问题。
set hive.optimize.bucketmapjoin.sortedmerge = true;
--2个分桶表JOIN设置参数--end

set hive.map.aggr=true; --启用 hive.map.aggr 参数后,Hive 将在 Map 阶段进行部分聚合操作,减少数据传输的数量。具体来说,Map 端会对局部数据进行聚合,将相同键的数据合并在一起,然后再传输给 Reduce 端进行最终的聚合操作。这样做的好处是减少了数据传输量,减轻了网络负载,从而提高了查询性能。尤其在处理大规模数据集时,启用 Map 端聚合功能可以有效减少整体作业的执行时间。但可能会增加 Map 阶段的内存消耗。

2 Doris

--建表语句
CREATE TABLE ods_ps_jc_ssjc
(

 `bsm`      varchar(32) NOT NULL    comment "标识码"
,`dwbsm`    varchar(32) NOT NULL    comment "点位标识码"
,`jczb`     varchar(32) NOT NULL    comment "监测指标"
,`jcz`      decimal(20,2) NOT NULL  comment "监测值"
,`jccjsj`   DATETIME    NOT NULL    comment "监测采集时间"
,`jcsbsj`   DATETIME    NOT NULL    comment "监测上报时间"
,`bz`       varchar(255)            comment "备注"
)
DUPLICATE KEY(`bsm`,`dwbsm`,`jczb`)
DISTRIBUTED BY HASH(`bsm`) BUCKETS 1
PROPERTIES(
"replication_allocation" = "tag.location.default: 1"
);


--创建动态分区表
CREATE TABLE doris_d.ods_ql_jc_ssjc_inc (
BSM             VARCHAR(32)     comment '标识码'
,DWBSM           VARCHAR(32)     comment '点位标识码'
,JCZB            VARCHAR(32)     comment '监测指标'
,JCZ             decimal(20,2)   comment '监测值'
,JCCJSJ          DATETIME        comment '监测采集时间'
,JCSBSJ          DATETIME        comment '监测上报时间'
,BZ              VARCHAR(255)    comment '备注'
,YSKZJBZ         VARCHAR(64)     comment '原始库主键标志'
,SJTBZT          VARCHAR(16)     comment '数据同步状态'
,SJTBSJ          DATETIME        comment '数据同步时间'
,SSCSDM          VARCHAR(6)      comment '所属城市代码'
,EXTRACT_TIME    DATETIME        comment '抽取时间'
)
DUPLICATE KEY(`BSM`)
COMMENT '桥梁实时监测属性结构表'
PARTITION BY RANGE(SJTBSJ) ()
DISTRIBUTED BY HASH(`SJTBSJ`) BUCKETS 1
PROPERTIES(
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
	"dynamic_partition.end" = "3",
	"dynamic_partition.prefix" = "p",
	"dynamic_partition.buckets" = "2",
	"replication_allocation" = "tag.location.default: 1"
);


--查询表中分区
SHOW PARTITIONS FROM doris_d.ods_ql_jc_ssjc_inc;
--查询建表语句
SHOW CREATE TABLE doris_d.ods_ql_jc_ssjc_inc
--查询表中某个分区
select * from doris_d.ods_ql_jc_ssjc_inc PARTITION p20230722

你可能感兴趣的:(降龙十八掌)