hive 笔记(有点乱,凑合看)

hive 笔记(有点乱,凑合看)


set hive.map.aggr=true;
set hive.groupby.skewindata=true;
set hive.merg.mapfiles=true;
set hive.mergejob.maponly=true;
set hive.merge.mapfiles = true;
set hive.merge.mapredfiles = true;
set hive.merge.size.per.task = 256*1000*1000; 
set hive.default.fileformat=RCFile;
set hive.exec.compress.output=true;
set hive.auto.convert.join=false;
set hive.tez.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;    --开启小文件合并
set hive.merge.size.per.task = 256000000;
set hive.merge.smallfiles.avgsize = 256000000;
set hive.merge.tezfiles=true;
set hive.exec.reducers.bytes.per.reducer = 256000000;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nostrict;
set mapred.min.split.size = 256000000;
set mapred.min.split.size.per.node = 256000000;
set mapred.min.split.size.per.rack = 256000000;

set hive.cli.print.current.db=true;
set hive.execution.engine=tez;

 set mapped.queue.name = llap;
=================================================
set mapred.reduce.tasks=3
select a.* from test_order.order_20160101 a 
order by user_name  desc
sort by user_name desc
limit 5
;

---------------------------------------------------------
1、现有queue两个 default=90%,llap=10%
现hive架构为hive on tez;未发现该架构配置queue to user的方式;通过手动设置的方式去提交application到指定queue。

2、在执行hive SQL前需要手动设置 
在执行hive SQL前需要手动设置,现有queue两个 default=90%,llap=10%,根据情况调整:
set tez.queue.name=llap;   //使用llap队列需要手动指定
set tez.queue.name=default; //默认是使用default队列,如果使用该队列无须做上述操作。
如:
set hive.execution.engine=tez;
set tez.queue.name=llap;
select count(*) from ods_bi_dev.welife_welife_qrcode_logs  t where qupdated='null' ;

select count(order_id) from test_order.order_20160101 a order by  order_id  ; 


select *   from ( select * from  test_order.order_20160101 a order by order_id)  t   limit 5;
select sum(*)   from ( select * from  test_order.order_20160101 a order by order_id)  t;

select count(*)   from ( select * from  test_order.order_20160101 a order by order_number)  t  ace ;

select max(order_number)   from ( select * from  test_order.order_20160101 a order by order_number)  t limit 5;


select max(order_number)   from ( select * from  test_order.order_20160101 a order by order_number)  t limit 5;

扫描二维码关注公众号,回复: 9566410 查看本文章

hive修改表名
alter table old_table_name rename to new_table_name;

hive复制表结构
create table new_table_name like table_name;


但是排序只能是倒序排序,不能指定排序规则为asc[倒序] 或者desc[正序]。


查看hive数据库:
show databases like 'tes*'
创建hive数据库
CREATE DATABASE IF NOT EXISTS db;
hive模糊搜索表
show tables like '*name*';
杀死某个任务  在hive shell中执行
hadoop job -kill job_201403041453_58315(作业ID)
解析hql语句的执行过程
explain select sum(id) from book;
普通表
load data local inpath '/xxx/xxx/dim_cube.txt' overwrite into table table_name;
或者
insert overwrite table book select * from table_name where dt='2014-01-22' limit 100
静态分区表
load data local inpath '/hadoop_tmp/11' overwrite into table book partition (pubdate='2010-08-22');

insert overwrite table book partition(pubdate='2010-08-22') select id,name from book2 where pubdate='2010-08-22';
多个分区
FROM book2 se
INSERT OVERWRITE TABLE book
PARTITION (pubdate='2010-08-22')
SELECT id,name WHERE pubdate='2010-08-22'
INSERT OVERWRITE TABLE book
PARTITION (pubdate='2010-08-23')
SELECT id,name WHERE pubdate='2010-08-23'
INSERT OVERWRITE TABLE book
PARTITION (pubdate='2010-08-24')
SELECT id,name WHERE pubdate='2010-08-24';F

2)、根据数据长度选择合适的类型
TINYINT (1字节,数据范围: -128 to 127)
SMALLINT (2字节,数据范围: -32,768 to 32,767)
INT (4字节,数据范围:-2,147,483,648 to 2,147,483,647)
BIGINT (8字节,数据范围: -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807)
FLOAT (4字节, 单精度浮点数)
DOUBLE (8字节,双精度浮点数)


hive.map.aggr=true;Map 端部分聚合,相当于Combiner
hive.groupby.skewindata=true;有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。
倾斜的逻辑
hive.groupby.skewindata=true
合并小文件
hive.merg.mapfiles=true:合并map输出
hive.merge.mapredfiles=false:合并reduce输出
hive.merge.size.per.task=256*1000*1000:合并文件的大小
hive.mergejob.maponly=true:如果支持CombineHiveInputFormat则生成只有Map的任务执行merge
hive.merge.smallfiles.avgsize=16000000:文件的平均大小小于该值时,会启动一个MR任务执行merge。

hive.merge.mapfiles=true; #在Map-only的任务结束时合并小文件
hive.merge.mapredfiles = true #在Map-Reduce的任务结束时合并小文件
hive.merge.size.per.task = 256*1000*1000 #合并文件的大小
hive.merge.smallfiles.avgsize=16000000 #当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge

Reduce个数 
hive.exec.reducers.bytes.per.reducer=<number> #每个reduce任务处理的数据量
hive.exec.reducers.max=<number> #每个任务最大的reduce数目
mapreduce.job.reduces=<number> #强制指定启动的reduce数


DefaultCodeC + RCFile的压缩方式均为最优,但使用该方式,会使得Pig 和Impala 无法使用(Impala的不兼容不确定是否是暂时的)。而DefaultCodeC+ SequenceFile 在压缩比,查询性能上略差于RCFile (压缩比约 6:5), 但可以支持 Impala实时查询。

立即压缩--注意: 1、Map阶段输出不进行压缩  2、对输出文本进行处理时不压缩
set hive.default.fileformat=RCFile;
SET hive.exec.compress.output=true;

创建表时指定压缩方式,默认不压缩,以下为示例:
create external table track_hist(
id bigint, url string, referer string, keyword string, type int, gu_idstring,string,ext_field10 string
)partitioned by (ds string) stored as RCFile location '/data/share/track_histk' ;
2.  插入数据是设定立即压缩
SET hive.exec.compress.output=true;
insert overwrite table track_histpartition(ds='2013-01-01')
select id,url, ext_field10 fromtrackinfo where ds='2013-01-01';

Hive-0.13.0之前不支持in 子查询,可以用left semi join的方式来替换in;not in可以用left outer join方式来替换
1.insert into是增加数据
2.insert overwrite是删除原有数据然后在新增数据,如果有分区那么只会删除指定分区数据,其他分区数据不受影响


分区表加载数据:
load data local inpath  '/home/daxin/jdata/boy' into table dogpartition(sex="boy");
load data local inpath  '/home/daxin/jdata/girl' into table dogpartition(sex="girl");
注意:sex属性是数据集里面没有的属性,这个是提前分类好的数据然后加载。

alter table pms.test_mobile_log add partition (ds='2015-05-27', hour='14') location '/user/pms/workspace/ouyangyewei/temp2/category.txt';

执行之后sex=boy下面的taidi、changmao两种数据都会被删除。可以这么理解:树的根节点删除,子节点当然也跟随删除了
alter table dog drop partition(sex='boy');

二、技术细节
1、一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。
2、表和列名不区分大小写。
3、分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。
4、建表的语法(建分区可参见PARTITIONED BY参数):
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path]
5、分区建表分为2种,一种是单分区,也就是说在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下出现多文件夹嵌套模式。
a、单分区建表语句:create table day_table (id int, content string) partitioned by (dt string);单分区表,按天分区,在表结构中存在id,content,dt三列。
b、双分区建表语句:create table day_hour_table (id int, content string) partitioned by (dt string, hour string);双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
表文件夹目录示意图(多分区表):

6、添加分区表语法(表已创建,在此基础上添加分区):
ALTER TABLE table_name ADD partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ... partition_spec: : PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
用户可以用 ALTER TABLE ADD PARTITION 来向一个表中增加分区。当分区名是字符串时加引号。例:
ALTER TABLE day_table ADD PARTITION (dt='2008-08-08', hour='08') location '/path/pv1.txt' PARTITION (dt='2008-08-08', hour='09') location '/path/pv2.txt';

7、删除分区语法:
ALTER TABLE table_name DROP partition_spec, partition_spec,...
用户可以用 ALTER TABLE DROP PARTITION 来删除分区。分区的元数据和数据将被一并删除。
例:
ALTER TABLE day_hour_table DROP PARTITION (dt='2008-08-08', hour='09');
alter table appdata_bi.acd_dprpt_welife_partner_view_w drop partition(dt_time=20180101);
alter table appdata_bi.acd_dprpt_welife_partner_view_w add partition(dt_time=20171216);

8、数据加载进分区表中语法:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

例:

LOAD DATA INPATH '/user/pv.txt' INTO TABLE day_hour_table PARTITION(dt='2008-08- 08', hour='08'); LOAD DATA local INPATH '/user/hua/*' INTO TABLE day_hour partition(dt='2010-07- 07');
当数据被加载至表中时,不会对数据进行任何转换。Load操作只是将数据复制至Hive表对应的位置。数据加载时在表下自动创建一个目录,文件存放在该分区下。

9、基于分区的查询的语句:
SELECT day_table.* FROM day_table WHERE day_table.dt>= '2008-08-08';

10、查看分区语句:
show partitions day_hour_table; OK dt=2008-08-08/hour=08 dt=2008-08-08/hour=09 dt=2008-08-09/hour=09


3) 修改表Hive表对应的目录
ALTER TABLE um_appuser SET LOCATION 'hdfs://node1:8020/user/hive/um_appuser';

4) 转换为外部表
ALTER TABLE um_appuser SET TBLPROPERTIES ('EXTERNAL'='TRUE');

--set hive.execution.engine=mr;
--set mapreduce.job.queuename=llap;
--打印列头字段名
set hive.cli.print.header=true;
set hive.cli.print.current.db=true;

set hive.cli.print.row.to.vertical=true;    // 开启行转列功能, 前提必须开启打印列名功能 
set hive.cli.print.row.to.vertical.num=1;   // 设置每行显示的列数

-- 行转列功能
-- 开启行转列功能, 前提必须开启打印列名功能
set hive.cli.print.row.to.vertical=true;
-- 设置每行显示的列数
set hive.cli.print.row.to.vertical.num=1;


---------------------
设置引擎 
set hive.execution.engine=mr; 
set hive.execution.engine=spark; 
set hive.execution.engine=tez; 

set hive.execution.engine=tez;
set tez.queue.name=default;

如果使用的引擎是tez
set tez.queue.name=etl
设置队列(etl为队列名称,默认为default)

如果使用的是mr(原生mapreduce) 
SET mapreduce.job.queuename=etl; 

如果使用的引擎是 etl 
tezset tez.queue.name=etl 设置队列(etl为队列名称,默认为default)


set hive.execution.engine=tez;
set tez.queue.name=default;
set hive.cli.print.header=true;
set hive.cli.print.current.db=true;


-- 设置hive的计算引擎为spark
set hive.execution.engine=spark;

-- 修复分区
set hive.msck.path.validation=ignore;
msck repair table sub_ladm_app_click_day_cnt;

-- 打印表头
set hive.cli.print.header=true;
set hive.cli.print.row.to.vertical=true;
set hive.cli.print.row.to.vertical.num=1;
 
-- 显示当前数据库
set hive.cli.print.current.db=true;


// 开启任务并行执行
set hive.exec.parallel=true;
// 同一个sql允许并行任务的最大线程数
set hive.exec.parallel.thread.number=8;


-- 从本地文件加载数据:
LOAD DATA LOCAL INPATH '/home/hadoop/input/ncdc/micro-tab/sample.txt' OVERWRITE INTO TABLE records;
load data local inpath '/home/hive/partitions/files' into table logs partition (dt='2017-08-01',country='GB');

-- 数组、map、结构
select col1[0],col2['b'],col3.c from complex;

--导出orc文件
hive --orcfiledump /user/hive/warehouse/sx_360_safe.db/user_reg_info_init2

-- 导出hive表数据
insert overwrite local directory '/tmp/tmp_20170830/app_210_s3_1016' row format delimited fields terminated by ',' select * from app_210_s3_1016;
cd /tmp/tmp_20170830/sub_ladm_exc_app_210_s3_1016
cat * > /tmp/tmp_20170830/result/app_210_s3_1016.csv
cd /tmp/tmp_20170830/result/
gzip app_210_s3_1016.csv

-- hive生成统一ID
2 select regexp_replace(reflect("java.util.UUID", "randomUUID"), "-", "");


-----------------------------------------------------------------------------

ALTER TABLE shphonefeature DROP IF EXISTS PARTITION(year = 2015, month = 10, day = 1);删除掉指定分区


确认主建唯一性:
select t.cfid,t.num from (select cfid,count(1) num from welife_cashier_fingerprint group by cfid ) t where t.num >1 order by t.num desc ; 

查询重读条数:
select username,count(*) as count from hk_test group by username having count>1;  
SELECT username,count(username) as count FROM hk_test GROUP BY username HAVING count(username) >1 ORDER BY count DESC;
查询重读条数:
select bidid,count(*) as count from (select concat(bid,id) bidid from welife_welife_users_update_multiple ) t  group by bidid having count>1 limit 40;  
SELECT bidid,count(bidid) as count FROM (select concat(bid,id) bidid from welife_welife_users_update_multiple ) t GROUP BY bidid HAVING count(bidid) >1 ORDER BY count DESC;

---------------------------------------------------------
3、spark可以通过在执行命令添加 
--queue llap
指定llap队列执行该application
//默认是使用default队列,如果使用该队列无须做上述操作


regexp_replace() 和 from_unixtime() 比较?
regexp_replace() 是字符串替换函数
from_unixtime() 是时间格式化函数
第一个是处理字符串的,第二个是专门处理时间的,如果是咱们的处理时间 建议用第二个
如果用第一个的话 ,得用to_date把时间转换成字符串才行
如:
regexp_replace(to_date(a.updatetime),'-','') <= '20180808'          #不建议使用
from_unixtime(unix_timestamp(updatetime),'yyyyMMdd') <='20180808'   #建议使用


HIVE修改表名
alter table old_table_name rename to new_table_name;
HIVE复制表结构
create table new_table_name like table_name;
HIVE添加字段
alter table table_name add columns(columns_values BIgint comment 'comm_text');
创建内部表
create table if not exists table_name
(字段名 字段类型)
partitioned by (pt string)
row format delimited
fields terminated by '\t' 字段分隔符
stored as textfile;       文件格式为文本型存储
创建外部表
create external table table_name
(字段名 字段类型)
partitioned by (pt string)
row format delimited
fields terminated by '\1'   字段分隔符
lines terminated by '\2'    行分隔符
stored as textfile          文件格式为文本型存储

=============================================================================
sqoop export \
--connect 'jdbc:mysql://59.110.7.160:3306/alipos_new?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull' \
--username 'sundawei' \
--password 'YunHaiYao@2009#POS' \
--table 'welife_users' \
--export-dir '/apps/hive/warehouse/expdata_bi.db/welife_welife_users_yhy' \
--input-fields-terminated-by '\001' \
--lines-terminated-by '\n' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
-m 3
=----------------------------------------------------------
      
      
 
echo -e "请输入:\c"  和 echo -n "请输入:"

hive 打印详细信息
hive -hiveconf hive.root.logger=DEBUG,console

-------------------------------------


gitlab表字段描述位置:表字段描述位置:
http://git.dev.acewill.net/welife/Trade/tree/master/src/Entity
都是 Entity里面
http://git.dev.acewill.net/welife/XXXX/tree/master/src/Entity    
你需要变更xxxx 去找表结构

字段描述都在Entity里面,DAO里面是对应的数据库和表
====================================================================================================


select * from ods_bi.welife_welife_tag2users_update_multiple having count(distinct id,uid)>1 limit 10; 

select uid,count(1) from ods_bi.welife_welife_tag2users_update_multiple t group by uid having count(uid)>1 limit 10;
select uid,count(1) from ods_bi.welife_welife_tag2users_update_multiple t having count(DISTINCT uid)>1 limit 10;

select id,uid,count(1) num from ods_bi.welife_welife_tag2users_update_multiple  having count(id,uid)>1 limit 10;
select t2uid,count(1) num from ods_bi.welife_welife_tag2users_update_multiple group by t2uid order by num desc  limit 10
select * from (select id,uid,count(1) num from ods_bi.welife_welife_tag2users_update_multiple t  group by id,uid ) a where num >1 limit 50 ;

sqoop export \
--connect 'jdbc:mysql://59.110.7.160:3306/alipos_new?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull' \
--username 'sundawei' \
--password 'YunHaiYao@2009#POS' \
--table 'welife_users' \
--export-dir '/apps/hive/warehouse/expdata_bi.db/welife_welife_users_yhy' \
--input-fields-terminated-by '\001' \
--lines-terminated-by '\n' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
-m 3

hive -hivevar v_date='20170630' -S -f test_par.hql


修改mysql字段长度:
use wedatas;
alter table wedatas_welife_user_assessments_v2s modify column `title1Other` varchar(2100) NOT NULL DEFAULT '' COMMENT '评价2备注';

闭链数据:
select y.start_dt,count(1) from ods_bi.welife_welife_managers_update_default y
where  from_unixtime(unix_timestamp(y.updatetime),'yyyyMMdd') = date_sub(to_date(y.end_dt), 1)
-- date_add(from_unixtime(unix_timestamp(y.updatetime),'yyyyMMdd'), 1) = to_date(y.end_dt)
and y.end_dt > '20180701' 
group by y.start_dt ;


日期增加函数 date_add(start_date, num_days)
返回类型:string
描述:返回增加num_days 天数的日期(负数则为减少)
date_add(start_date, num_days) - Returns the date that is num_days after start_date.
实例:
hive>select date_add('2014-09-16 15:50:08.119',10) from default.dual;
2014-09-26
hive>select date_add('2014-09-16 15:50:08.119',-10) from default.dual;
2014-09-06

9.日期减少函数 date_sub(start_date, num_days)
返回类型:string
描述:返回num_days 天数之前的日期(负数则为增加)
date_sub(start_date, num_days) - Returns the date that is num_days before start_date.
实例:
hive>select date_sub('2014-09-16 15:50:08.119',10) from default.dual;
2014-09-06
hive>select date_sub('2014-09-16 15:50:08.119',-10) from default.dual;
2014-09-26

10.周期函数 weekofyear(start_date, num_days)
返回类型:int
描述:返回当前日期位于本年的周期 一周一个周期
weekofyear(date) - Returns the week of the year of the given date. A week is considered to start on a Monday and week 1 is the first week with >3 days.
实例:
hive>select weekofyear('2014-09-16 15:50:08.119') from default.dual;
38

11.日期比较函数 weekofyear(start_date, num_days)
返回类型:string
描述:返回2个时间的日期差
datediff(date1, date2) - Returns the number of days between date1 and date2
date1-date2
实例:
hive>select datediff('2014-09-16 15:50:08.119','2014-09-15') from default.dual;

1

--统计微信点餐今年1-7月份各个商家的订单流水情况统计汇总
SELECT 
from_unixtime(unix_timestamp(a.tclCreated),'yyyyMM') mon,
a.bid,    
b.bBrandName,
count(*) as `统计汇总`
FROM ods_bi.welife_welife_trade_consume_logs_stream_default a
LEFT JOIN (select bid,bBrandName,updatetime
              from ods_bi.welife_welife_bizs_update_default
              where from_unixtime(unix_timestamp(updatetime),'yyyyMMdd') >= '20180101' 
                and from_unixtime(unix_timestamp(updatetime),'yyyyMMdd') < '20180801' 
                and end_dt >'20180801'
               ) b ON a.bid=b.bid
WHERE from_unixtime(unix_timestamp(a.updatetime),'yyyyMMdd') >='20180101' 
  and a.tcPayType=6
  AND a.tcType=2
  AND a.tclTradeType=1
  AND a.tcPayType=6
  AND tcSourceType=1
  and nvl(length(get_json_object(a.tcRemark, '$.weixinPayId' )),0) > 0   --提取json数据 大于0 说明有值
GROUP BY a.bid,b.bBrandName,from_unixtime(unix_timestamp(a.tclCreated),'yyyyMM') 


while true;do  aa=`ll -tlr |awk '{print$9}'|tail -1 ` ; tail -200f $aa ;sleep 2  ; done

====================================================================================================


1.建立历史表
create external table history(imei string, version string) partitioned by (event_day string)
 row format delimited fields terminated by '\t';

2.加载历史表文件到hive表中,此处我用的是本地文件映射到hive中,而非集群路径,具体路径要看你实际
load data local inpath '/home/work/fangguoqing/log/history' overwrite into table history partition (event_day='20140709');

3.抽样检查,看是否导入成功
select * from history where event_day='20140709' limit 20;


1.建立每天数据表
create external table day(imei string, stat_day string, stat_hour string, version string, channel string, os_name string, os_version string, action_type string, 
ip string) partitioned by (event_day string) row format delimited fields terminated by '\t';

2.加载天数据文件到hive表中,此处我用的是本地文件映射到hive中,而非集群路径,具体路径要看你实际
load data local inpath '/home/work/data/log/today' overwrite into table day partition (event_day='20140710');

load data local inpath '/home/work/data/log/second' overwrite into table day partition (event_day='20140711');


3.抽样检查,看是否导入成功
select * from day where event_day='20140710' limit 20;

1.新增
select count(*) 
from 
(select imei from day where event_day='20140710') a
left outer join
(select imei from history where event_day='20140709') b
on a.imei = b.imei
where b.imei is null;


2.次日留存
select count(*) 
from 
    (select imei from day where event_day='20140710') a
left outer join
    (select imei from history where event_day='20140709') b
on a.imei = b.imei
left semi join
    (select imei from day where event_day='20140711')c
on a.imei = c.imei
where b.imei is null;


3.老用户
select count(*) 
from 
(select imei from day where event_day='20140710') a
left semi join
(select imei from history where event_day='20140709') b
on a.imei = b.imei;


4.日活
select count (distinct imei) from day where event_day='20140710';


5.历史
select count(distinct imei) from 
(
select imei from day where event_day='20140710'
union all
select imei from history where event_day='20140709'
union all
select imei from day where event_day='20140709'
)a


1.队列与优先级
http://www.cnblogs.com/ggjucheng/archive/2012/07/25/2608817.html
http://blog.csdn.net/jiedushi/article/details/7920455

2.hive表结构修改
http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843393.html
http://blog.csdn.net/xiaoping8411/article/details/7605039


3.讲课定位


4.机器学习是机器在学习人,人的长处是识别与推理,所见所闻、自身经历、别人观点去学习知识,机器没有主观能力,主要是面对数据,就是人的所做所为,还有多媒体数据,评分数据等等,机器没有眼睛,对数据量与质量有要求,大数据不缺量,

5.好的学习方式,记录方式,解决问题的能力

huoyue <- dau$活跃用户数
plot(huoyue)
plot(ts(huoyue))
plot(decompose(ts(huoyue)))

wfit <- lm(weight ~ height + I(height^2),data=women)
plot(women)
lines(women$height,fitted(wfit))
predict(wfit, data.frame(height<-c(60)))

SELECT REPLACE(partition_name,'p_','') p_max FROM INFORMATION_SCHEMA.PARTITIONS WHERE table_name='wedatas_welife_user_assessments_stat_score_v2' and partition_name='p_20180712';

SELECT partition_name part,partition_expression expr, partition_description descr, table_rows FROM INFORMATION_SCHEMA.partitions WHERE TABLE_SCHEMA = SCHEMA() 
AND TABLE_NAME='wedatas_welife_user_assessments_stat_v2' and descr>'20180707';

select date_format(UpdateTime,'%Y-%m-%d') ftime,count(1) from welife_trade_consume_products where UpdateTime>='2017-08-20 23:59:59'  group by ftime;  


select from_unixtime(unix_timestamp(tcpCreated),'yyyyMMdd') tcpCreated,bid,sid,
regexp_replace(regexp_replace(regexp_replace(tcpList, '^\\[', ''), '\\]$', ''), '\\},\\{', '\\}\&\\{') tcpList 
from ods_bi.welife_welife_trade_consume_products_stream_default 
where dt_time='20180829' 
and from_unixtime(unix_timestamp(tcpCreated),'yyyyMMdd')='20180829'
limit 30;


例子:格式化当前日期为 年月日时分秒
DATE_FORMAT(NOW() , '%Y-%m-%d %H:%i:%s')


  注意。在有些情况下要使用转义字符,以下的等号要用双竖线转义,这是java正則表達式的规则。
    select data_field,
     regexp_extract(data_field,'.*?bgStart\\=([^&]+)',1) as aaa,
     regexp_extract(data_field,'.*?contentLoaded_headStart\\=([^&]+)',1) as bbb,
     regexp_extract(data_field,'.*?AppLoad2Req\\=([^&]+)',1) as ccc
     from pt_nginx_loginlog_st 
     where pt = '2012-03-26'limit 2;

=============================================================================
奥琦玮导数据(8月上线门店和续约门店)
解决php值班人员反馈问题3个

青年餐厅 ID: 1148244516   18324603697  (密码同)魔方中一个等级下的数据为0

mysqlquery welife "select count(*) from welife3.welife_users3 where bid=1148244516 and ccid=3011246  \G" 

========================================================================================================================
  命令行模式,或者说目录模式,可以使用hive 执行命令。
选项说明:
  -e : 执行短命令
  -f :  执行文件(适合脚本封装)
  -S : 安静模式,不显示MR的运行过程
  -hivevar : 传参数 ,专门提供给用户自定义变量。
  -hiveconf : 传参数,包括了hive-site.xml中配置的hive全局变量。

例子1:hive -e 查询

  命令: hive -S -e "use default; select * from kimbo_test limit 3;"

例子2:hive -f 执行文件

  命令: hive -S -f test_k.hql          -- 返回3条记录

例子3:hive -f 参数传递,执行文件

  命令: hive -hivevar v_date='20170630' -S -f test_par.hql    -- 返回3条记录

  命令: hive -hivevar v_date='20170101' -S -f test_par.hql    -- 返回0条记录

查看文件内容:

  cat test_par.hql

    use default; select * from kimbo_test where dt='${hivevar:v_date}' limit 3;

  cat test_k.hql 

    use default; select * from kimbo_test limit 3;

-d <driver class>  ---使用一个驱动类:beeline -d driver_class  
-e <query>  ---使用一个查询语句:beeline -e "query_string"  
-f <file>  ---加载一个文件:beeline -f filepath  多个文件用-e file1 -e file2

-n <username>  ---加载一个用户名:beeline -n valid_user  
-p <password>  ---加载一个密码:beeline -p valid_password  
-u <database URL> ---加载一个JDBC连接字符串:beeline -u db_URL
  
 总结
本文主要阐述了两种在hive中使用变量的方法,第一种是在shell中定义变量然后在hive -e的SQL语句中直接用${var_name}的方法调用;
第二种是使用hive –hiveconf key=value –f run.sql模式使用-hiveconf来设置变量,然后在SQL文件中使用${hiveconf:varname}的方法调用。
用这两种方法可以满足开发的时候向hive传递参数的需求,会很好的提升开发效率和代码质量。

  
表格 4    hivevar  和  hiveconf   传递变量的方法
hive -hivevar -f file                        |
hive?-hivevar tbname=’a’ -hivevar count=10?  |-f filename.hql
                                             |
hive -hivevar -e cmd                         |
hive?-hivevar tbname=’a’ -hivevar count=10  ?|-e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’
                                             |
hive -hiveconf -f file                       |
hive?-hiveconf tbname=’a’ – hiveconf count=10|?-f filename.hql
                                             |
hive -hiveconf -e cmd                        |
hive?-hiveconf tbname=’a’ -hiveconf count=10 |?-e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’
                                             |

  
echo " 格 4    hivevar  和  hiveconf   传递变量的方法"
echo "hive -hiveconf -e cmd                                                                                          "
echo "hive?-hiveconf tbname=’a’ -hiveconf count=10?-e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’       "

 
  
  
  hive -hivevar v_date='20170630' -S -f test_par.hql

      hive -hivevar v_date='20180708' -e"select * from ods_bi_beta.welife_welife_users_update_multiple t where start_dt='${hivevar:v_date}' limit 1;"

  
  
  
  
  2、hive在1.0版本之后,支持了hive -f 的参数传递,且支持多参数的传递
使用如下:
test.sql

select * from ods.tracklog where day='${hiveconf:day}' and requesturl like '%${hiveconf:url}%'  limit 15
调用方式如下:
hive -hiveconf day=20151115 -hiveconf url=licaike -f test.sql

结果正常返回 

3、总结,生产中 hive -e 与 hive -f 都可以使用,hive -f 解决了参数传递的问题将更多的用在生产中

hive?-hivevar  tbname=’a’ -hivevar count=10  ?|-e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’         
hive?-hiveconf tbname=’a’ -hiveconf count=10 |?-e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’
     
  
======================================================================
spark 分区数 设置
--conf spark.sql.shuffle.partitions=200
set spark.sql.shuffle.partitions=200;

    os.system("spark-submit --master yarn-client --driver-memory 5g \
               --executor-cores 10 --num-executors 30 --executor-memory 10g \
               --conf spark.sql.shuffle.partitions=500 --class cn.acewill.magic.spark.MagicCubeMain "+pro_dir+"/jar/spark_acewill_oldreport.jar "
+db_app+" "+db_in+" "+run_day+" "+trade_consumes_table+" "+trade_charges_table+" "+coupon2users_table+" "+user_savings_table+" "+user_credit_tabl
e+" "+user_qrcodes_table+" "+users_table+" "+app_charges_table+" "+app_consumes_table+" "+app_summary_table+" "+app_mvm_table+" "+ods_tags_table+
" "+ods_tag2users_table+" "+ods_bidMvm_table+">> "+log_dir+"/dataCube.log 2>&1 ")


======================================================================
使用python访问hive进行数据库创建,代码如下:
https://blog.csdn.net/yidu_fanchen/article/details/77680657


from pyhive import hive
from TCLIService.ttypes import TOperationState

# 打开hive连接
hiveConn = hive.connect(host='192.168.83.135',port=11111)
cursor = hiveConn.cursor()

# 执行sql语句
sql = ''' CREATE DATABASE userdbbypy '''
cursor.execute(sql, async=True)

# 得到执行语句的状态
status = cursor.poll().operationState
print "status:",status

# 关闭hive连接
cursor.close()
hiveConn.close()
————————————————
--  删除库
drop database if exists db_name;
--  强制删除库
drop database if exists db_name cascade;
--  删除表
drop table if exists employee;
--  清空表
truncate table employee;
--  清空表,第二种方式
insert overwrite table employee select * from employee where 1=0; 
--  删除分区
alter table employee_table drop partition (stat_year_month>='2018-01');
--  按条件删除数据
insert overwrite table employee_table select * from employee_table where id>'180203a15f';
————————————————


beeline -u jdbc:hive2://10.12.9.93:10000 -n hdfs

-----------------------------: mysql 
alter命令可执行对表的结构进行修改:
1、添加一列
alter table tablename add newfile definition;
2、改变表的数据类型
alter table tablename change columname newdefinition;
3、给表添加索引
alter table tablename add index columname newdefinition;
4、给表添加唯一列
alter table tablename add unique columname ...
5、从表中删除一列
alter table tablename drop columname;

---------------------------------------------------------------------------------------------
 

-- 1、ODS层内部表(第一种写法)
DROP TABLE IF EXISTS DEV_EAM.ODS_EAM_MAXIMO_UDBAINFO_SMT;
CREATE TABLE DEV_EAM.ODS_EAM_MAXIMO_UDBAINFO_SMT (
BDCZBRQ STRING COMMENT '变电出质保日期',
BGLX STRING COMMENT '变更类型',
BRANCH STRING COMMENT '运营中心',
BWDATE STRING COMMENT '并网时间',
) COMMENT '风电厂基本信息表' PARTITIONED BY (dm STRING)
ROW FORMAT DELIMITED NULL DEFINED AS '' 
STORED AS ORCFILE;

-- 1、ODS层内部表(第二种写法)
-- 设置分区数量
set spark.sql.shuffle.paritions=5;
-- 关闭自动广播小表
set spark.sql.autoBroadcastJoinThreshold=-1;
-- 是否开启动态资源配置
set spark.dynamicAllocation.enabled=true;

DROP TABLE IF EXISTS DEV_EAM.ODS_EAM_MAXIMO_UDBAINFO_SMT;
CREATE TABLE DEV_EAM.ODS_EAM_MAXIMO_UDBAINFO_SMT (
BDCZBRQ STRING COMMENT '变电出质保日期',
BGLX STRING COMMENT '变更类型',
BRANCH STRING COMMENT '运营中心',
BWDATE STRING COMMENT '并网时间',
) COMMENT '风电厂基本信息表' PARTITIONED BY (dm STRING COMMENT '分区')
ROW FORMAT DELIMITED fields terminated by '\001'
lines terminated by '\n'  NULL DEFINED AS '' 
STORED AS PARQUET;


-----------------

drop table if exists demo_dim_address_city;
create table if not exists demo_dim_address_city
(
address_id bigint comment '业主⼩小区id'
,address string comment '业主⼩小区'
, city string comment '城市'
)
comment'⼩小区和城市映射维表'
row format delimited
fields terminated by'\t'
lines terminated by'\n'
stored as textfile;

如果想都放进去,就把字段的长度或类型改一下;
比如 Varchar 的长度是很有限的,那你就可以用 Text、mediumtext,longtext;
或者你也可以用 blob,mediumblob,longblob;


====================================================sparksql优化
-- 设置分区数量
set spark.sql.shuffle.paritions=5;
-- 关闭自动广播小表
set spark.sql.autoBroadcastJoinThreshold=-1;
-- 是否开启动态资源配置
set spark.dynamicAllocation.enabled=true;

//1.下列Hive参数对Spark同样起作用。
set hive.exec.dynamic.partition=true; // 是否允许动态生成分区
set hive.exec.dynamic.partition.mode=nonstrict; // 是否容忍指定分区全部动态生成
set hive.exec.max.dynamic.partitions = 100; // 动态生成的最多分区数

//2.运行行为
set spark.sql.shuffle.partitions; // 需要shuffle是mapper端写出的partition个数
set spark.sql.autoBroadcastJoinThreshold; // 大表 JOIN 小表,小表做广播的阈值
set spark.dynamicAllocation.enabled; // 是否开启动态资源配置,根据工作负载来衡量是否应该增加或减少executor,默认false
set spark.dynamicAllocation.maxExecutors; //开启动态资源分配后,最多可分配的Executor数
set spark.dynamicAllocation.minExecutors; //开启动态资源分配后,最少可分配的Executor数
set spark.sql.adaptive.enabled;       // 是否开启调整partition功能,如果开启,spark.sql.shuffle.partitions设置的partition可能会被合并到一个reducer里运行
set spark.sql.adaptive.shuffle.targetPostShuffleInputSize; //开启spark.sql.adaptive.enabled后,两个partition的和低于该阈值会合并到一个reducer
set spark.sql.adaptive.minNumPostShufflePartitions; // 开启spark.sql.adaptive.enabled后,最小的分区数
set spark.hadoop.mapreduce.input.fileinputformat.split.maxsize; //当几个stripe的大小大于该值时,会合并到一个task中处理

//3.executor能力
set spark.executor.memory; // executor用于缓存数据、代码执行的堆内存以及JVM运行时需要的内存
set spark.yarn.executor.memoryOverhead; //Spark运行还需要一些堆外内存,直接向系统申请,如数据传输时的netty等。
set spark.sql.windowExec.buffer.spill.threshold; //当用户的SQL中包含窗口函数时,并不会把一个窗口中的所有数据全部读进内存,而是维护一个缓存池,当池中的数据条数大于该参数表示的阈值时,spark将数据写到磁盘
set spark.executor.cores; //单个executor上可以同时运行的task数


之前一直用thrift链接Hive,但在运行时总出现问题,一直报缺少模块的错误,装了这个模块,又报缺少那个模块,连了半天,全是泪啊!

原来thrift链接Hive的.py文件后续没人维护,是连不上的。

果断放弃thrift,直接用impala,哈哈,终于连上了,我那个兴奋啊,你懂的。

需要的亲们,直接拿去用吧。

from impala.dbapi import connect
conn = connect(host="10.1.2.72", port=10000,database="moreqinrdb")

########链接Hive
cursor = conn.cursor()
cursor.execute("SELECT * FROM COMPANY_BUSINESS_INFO")
results = cursor.fetchall()
colname=[]
coladdress=[]
colscope=[]
for data in results:
colname.append(data[0])
coladdress.append(data[12])
colscope.append(data[13])
print(coladdress,'\n')


D:\soft_work\JetBrains\Anaconda3\envs\Anaconda2


activate Anaconda2

15112345678/dtwave@2018

spark中split()特殊符号"."  "|"   "*"   "\"  "]"

关于点的问题是用string.split("[.]") 解决。
关于竖线的问题用 string.split("\\|")解决。
关于星号的问题用 string.split("\\*")解决。
关于斜线的问题用 sring.split("\\\\")解决。
关于中括号的问题用 sring.split("\\[\\]")解决。

【Hive】split函数(分割字符串)
https://blog.csdn.net/qq_34105362/article/details/80408621

hive> select split('ab_cd_ef', '\_')[0] from test;
ab
hive> select split('ab?cd_ef', '\\?')[0] from test;
ab
如:
正确的写法:
split('192.168.0.1','\\.')
得到的结果:
["192","168","0","1"]

需要注意的是:
当然当split包含在 "" 之中时 需要加4个\
如 hive -e "....  split('192.168.0.1','\\\\.') ... "  不然得到的值是null
同样的 | 等特殊符号也需要做类似 处理。


利用表达式
 
echo 'hello' | tr 'a-z' 'A-Z'
echo 'HELLO' | tr 'A-Z' 'a-z'

结果:
 
HELLO
hello


=========================PostgreSQL ===========================================

命令行登录 
1、首先切换到postgres用户,一般数据库安装都会指定一个postgres用户: 
su postgres 
2、登录数据库命令:psql -U user_name -d database_name -h serverhost 
例如:psql -h 127.0.0.1 -d mydata -U dbuser 
3、查看帮助: help 
\h #查看所有的sql关键字 
\? #命令行操作的帮助 
\d #查看当前schema 中所有的表 
\q #退出pg命令行 
\d #schema.table 查看表的结构 
\x #横纵显示切换 
\dT+ #显示扩展类型相关属性及描述 
\l #列出所有的数据库 
\timing #显示执行时间 
\c database_name #切换数据库 
set search to schema #切换schema 
explain sql #解释或分析sql执行过程 

CREATE TABLE workorder(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);
-- 给字段加注释:
comment on column workorder.id is '主键ID,自增';
comment on column workorder.NAME is '姓名';
comment on column workorder.age is '年龄';

-- 给表添加注释:
comment on table workorder is '员工订单';


------------------------------------------mysql ----------------------------
1.将同一个表中的一个字段create_time的值复制给另一个字段signed_time
UPDATE t_user SET signed_time = create_time

2.将同一个表中两个类型一样的字段的值互换
UPDATE t_user u1, t_user u2
SET u1.signed_time = u2.create_time,
u2.create_time = u1.signed_time

3.不同表一列复制到另一个列
update table1,table2 set table1.field1=table2.field2 where table1.id=table2.id


修改数栖平台mysql库字段内容:
select * from asset_service.bas_table where table_name='dwd_sf_pa_jobchangesnew_sdt';

update  asset_service.bas_table set table_cn_name='PA_员工岗位异动报表'   where id='296490';
UPDATE asset_service.bas_table SET table_cn_name = descr   where id='296490';    ------  建议使用此句
UPDATE asset_service.bas_table SET table_cn_name = descr   where table_name like '%ods%' 

--------------------------------
SELECT id, table_name, table_cn_name,   create_time, data_mtime, descr, ctime, mtime, invalid
FROM asset_service.bas_table
where storage_name='集团财务数据_hive93';


update asset_service.bas_table set table_cn_name = descr where table_name = 'ods_financial_sapfs_producecost_smi';

UPDATE asset_service.bas_table SET data_mtime = create_time   where storage_name='集团财务数据_hive93';

发布了15 篇原创文章 · 获赞 0 · 访问量 234

猜你喜欢

转载自blog.csdn.net/u011521584/article/details/104646882