Hive解题思路

                                                    Hive解题思路

1 相关知识讲解

1.1 HQL语句的语法

sql语句的语法:

select ..... from .... join ..... where .....group by ... having...order by|sort by|cluster by|distribute by  ....

(1)group by:按照某些字段的值进行分组,相同的一组。注意:限制了select字段,发生在select之前,不可以使用select别名,select后面非聚合列,必须出现在group by中 select后面除了普通列就是一些聚合操作 group by后面也可以跟表达式。

(2)where和having:都是限定返回的数据集。

where:对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

having:在分组group by后,将分组后的不符合条件的数据过滤掉,

查询语句的聚合函数只能出现在select 和group by ,having 子句。

(3)四个排序关键字

①order by:对输入做全局排序,所以只有一个reduce,当数据量大时,导致效率低;

②sort by:局部排序,不是全局排序,其在数据进入 reducer 前完成排序。如果用 sort by 进行排序,并且设置 mapred.reduce.tasks>1,那么 sort by只保证每个 reducer 的输出有序,不能保证全局有序;

③distribute by:根据指定的字段将数据分到不同的 reducer,分发算法是 hash 散列;

④cluster by:如果distribute by后面的字段和sort by后面的字段一样,cluster by = distribute by + sort by

1.2 窗口函数over

聚合函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的,但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。窗口函数的执行时间且仅位于Order by字句之前。

分析函数  over(开窗依据distribute by |partition by 每一个窗口的排序规则 sort by |order by  ) 子句  窗口函数   开窗函数

distribute by与 sort by搭配,partition by与order by 。

over子句不可单独使用,有两种搭配方式:

(1)与聚合函数一起使用,求的是每一个窗口内的聚合

①聚合函数  + over(distribute by )  整个窗口的整体聚合

select max(sumpv) over(distribute by userid) from test;

②聚合函数  + over(distribute by  sort by ) 截止到排序数据之前的,即当前。sort by子句会让输入的数据强制排序

执行顺序:distribute by 整个窗口 + sort by一条 + max 

select userid,month,sumpv,max(sumpv) over(distribute by userid sort by sumpv) from test;

③如果已经通过使用partition by子句将数据进行了分组的处理,如果我们想要更细粒度的划分,我们就要引入window子句了

window子句: - PRECEDING:往前              - FOLLOWING:往后                - CURRENT ROW:当前行         

- UNBOUNDED:起点          UNBOUNDED PRECEDING 从前面的起点     UNBOUNDED FOLLOWING:到后面的终点

select 
userid,month,sumpv,

 

sum(sumpv) over()  as sumpvv1  

 #所有行相加

 

sum(sumpv) over(partition by userid) as sumpvv2  

#按userid分组,组内数据相加

 

sum(sumpv) over(partition by userid order by month) as sumpvv3  

#按userid分组,组内数据累加

 

sum(sumpv) over(partition by userid order by month rows between UNBOUNDED PRECEDING and current row) as sumpvv4  

#按userid分组,组内数据累加

 

sum(sumpv) over(partition by userid order by month rows between 1 PRECEDING and current row) as sumpvv5 

#当前行和前面一行做聚合

 

sum(sumpv) over(partition by userid order by month rows between 1 PRECEDING and  1 FOLLOWING) as sumpvv6 

#当前行和前边一行及后面一行

 

sum(sumpv) over(partition by userid order by month rows between current row and UNBOUNDED FOLLOWING) as sumpvv  7

#当前行及后面所有行

 

from test;

④over(partition by)与group by的主要区别为,带上group by的hql语句只能显示与分组聚合相关的字段,而带上over(partition by ......)的hql语句能显示所有字段.。

(2)与序列函数使用

序列函数是不支持window子句的

①NTILE(n),用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布

使用场景:假如我们想要每位顾客购买数量前1/5的交易记录,我们便可以使用这个函数.

select userid,month,sumpv,

 nitle(5) over()  #全局数据切片

  nitle(5) over(partition by userid)  #按照userid进行分组,在分组内切片

  nitle(5) over(order by month) #全局按照月份升序排列,数据切分成5份

  nitle(5) over(partition by userid order by month) #按照userid进行分组,在分组内按照月份升序排列,数据切分成5份

from test;

②row_number()、rank()、dense_rank()

row_number():生成分组内记录的序列,从1开始,按照顺序,row_number()的值不会存在重复,当排序的值相同时,按照表中记录的顺序进行排列;

RANK():生成数据项在分组中的排名,排名相等会在名次中留下空位 ;

DENSE_RANK():生成数据项在分组中的排名,排名相等会在名次中不会留下空位。

③lag和lead

LAG  (scalar_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause)

LEAD (scalar_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause);

这两个函数为常用的窗口函数,可以返回上下数据行的数据.

使用场景:如要查看顾客上次的购买时间可以这样去查询

select userid,month,sumpv,

  lag(month,1,'1900-01-01') over(partition by userid order by month) #按照userid进行分组,在分组内按照月份升序排列,取上一行数据的值。当没有上一行时取1900-01-01'

 lag(month,2') over(partition by userid order by month) #按照userid进行分组,在分组内按照月份升序排列,取上面2行的数据的值,当没有上两行时取NULL

 lead(month,1,'1900-01-01') over(partition by userid order by month) #按照userid进行分组,在分组内按照月份升序排列,取上下行数据的值

from test;

当lag函数未设置行数值时,默认为1行.未设定取不到时的默认值时,取null值.

④first_value和last_value

first_value取分组内排序后,截止到当前行,第一个值 ;last_value取分组内排序后,截止到当前行,最后一个值。

select userid,month,sumpv,

  first_value(month,1,'1900-01-01') over(partition by userid order by month) #按照userid进行分组,在分组内按照月份升序排列,截止到当前行的第一个值

 last_value(month,2') over(partition by userid order by month) #按照userid进行分组,在分组内按照月份升序排列,截止到当前行的最后一个值,即当前行

 lead(month,1,'1900-01-01') over(partition by userid order by month) #按照userid进行分组,在分组内按照月份升序排列,取上下行数据的值

from test;

2 使用窗口分析函数

现有这么一批数据

三个字段的意思:
用户名,月份,访问次数

A,2015-01,5
A,2015-01,15
B,2015-01,5
A,2015-01,8
B,2015-01,25
A,2015-01,5
A,2015-02,4
A,2015-02,6
B,2015-02,10
B,2015-02,5
A,2015-03,16
A,2015-03,22
B,2015-03,23
B,2015-03,10
B,2015-03,11

现要求出:如每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数

分析:求每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数

既显示聚集前的数据,又要显示聚集后的数据,并且如果单是求最大单月访问次数的话直接按照用户+月份分组就行,但是还要求累计到该月,就应该联想当窗口函数,窗口函数有很多,比如:聚合函数  + over() ---整个窗口的整体聚合   first_value() over--分组后截止到当前行第一个值等。因为是要求累计到当前月,所以前面的数据是全部都要的。那么就可以使用 sum(字段名)  + over(distribute by 字段名 sort by 字段名) ---------截止到排序数据之前的即当前 或 sum(字段名) over(partition by 字段名 order by 字段名 rows between UNBOUNDED PRECEDING and current row)

select  userid,
 MONTH,
 sumpv,
 max(sumpv) over (
    PARTITION BY userid
    ORDER BY
        MONTH
) maxpv,
 sum(sumpv) over (
    PARTITION BY userid
    ORDER BY
        MONTH
) sumpvv   
FROM
    test;

当然这题还有其他的解决方案,比如自连接

SELECT
    buserid,
    bmonth,
    bsumpv,
    max(asumpv) maxpv,
    sum(asumpv) sumpv
FROM
    (
        SELECT
            *
        FROM
            (
                SELECT
                    a.userid auserid,
                    a. MONTH amonth,
                    a.sumpv asumpv,
                    b.userid buserid,
                    b. MONTH bmonth,
                    b.sumpv bsumpv
                FROM
                    test a
                JOIN test b ON a.userid = b.userid
            ) c
        WHERE
            amonth <= bmonth
    ) d
GROUP BY
    buserid,
    bmonth,
    bsumpv;

总结:当题目要求既显示聚集前的数据,又要显示聚集后的数据,并且还要对数据进行累加的时候要想到用窗口函数。

 

3 行列转换

(1)行转列

数据如下:

求:所有数学课程成绩 大于 语文课程成绩的学生的学号

思路:要求的是数学成绩>语文成绩的学生的学号,目前的数据一行是每个学生每一科的成绩,我们查询出来的数据是一条一条的,并且可能每个学生的科目数量有可能不一样,那么要比较不同的行的数据是非常困难的。而我们知道当数据在同一行时,这一行的数据是非常好进行比较的,那么我们就可以将行转换成列,那么要比较的就在同一行了,处理起来非常容易。

那么接下来就是怎样将列转换成行,我们知道查询出来的结果的列是根据select后面的字段名的个数而定的,select后有多少个字段,查询的结果就有多少个列。因为科目是固定的,那么列就加上所有的科目,所以我们就可以原表中的每一行查询出来后进行进行判断,并对这条记录中的科目放到对应的select后字段下。那么就可以使用case when条件判断。

case when 
语法1:相当于switch语句
case 字段 
when 值1 then 返回值1 
when 值2 then 返回值2 
else 返回值3 end 

switch(字段){
    case 值1 
    case 值2 
    default      
}

语法2:相当于if else 
case  
when 条件1 then 返回值1 
when 条件2 then 返回值2 
else 返回值3 end 

 

使用条件判断语句后有如下结果

SELECT
    sid,
    CASE
WHEN course = "yuwen" THEN
    score
ELSE
    0
END yuwen,
 CASE
WHEN course = "shuxue" THEN
    score
ELSE
    0
END shuxue
FROM
    course;

接下来就要合并相同id的数据,最终语句如下

SELECT
    sid,max(yuwen) yuwen,max(shuxue) shuxue
FROM
    (
        SELECT
            sid,
            CASE
        WHEN course = "yuwen" THEN
            score
        ELSE
            0
        END yuwen,
        CASE
    WHEN course = "shuxue" THEN
        score
    ELSE
        0
    END shuxue
    FROM course
    ) a
GROUP BY sid
HAVING shuxue > yuwen;

 

 

需求如下:

思路:因为要显示所有的课程,所以首先要使用collect_set()函数---将分组中的某列转为一个数组返回,获取到所有课程,然后获取到每一个学员所选的科目,判断有哪些科目,这里可以用if判断语句。所以把查询出一个所有课程作为一个表,每一个学员所选的科目作为另一个表,因为所有课程的表只有一条数据,所以可以用笛卡尔积。

hive 处于安全考虑   没有开启笛卡尔积,所以要手动开启,设置如下

set hive.strict.checks.cartesian.product=false;

set hive.mapred.mode=nonstrict;

select 
    id,
    if(array_contains(stu_courses,all_courses[0]),1,0) a,
    if(array_contains(stu_courses,all_courses[1]),1,0) b,
    if(array_contains(stu_courses,all_courses[2]),1,0) c,
    if(array_contains(stu_courses,all_courses[3]),1,0) e,
    if(array_contains(stu_courses,all_courses[4]),1,0) d,
    if(array_contains(stu_courses,all_courses[5]),1,0) f 
from 
    (select 
        b.id id,b.course stu_courses,a.all_courses all_courses 
    from 
        (select 
            collect_set(course) all_courses 
        from course03) a 
    join 
        (select 
            id,collect_set(course) course 
        from course03 
        group by id) b

    )c;

总结:行转列即是把行转列前的分行条件,分别作为行转列后的各列的筛选条件。可以借助case when,if等判断函数,与collect_set(),collect_list()函数

(2)列转行在下面的TopN例子中一起讲解

4 group by相关问题

现有如下数据

2001010310
2001010411
2001010529
2013010619
2013010722
2013010812
2013010929
2013011023
2008010105
2008010216
2008010337
2008010414
2008010516
2007010619
2007010712
2007010812
2007010999
2007011023
2010010114
2010010216
2010010317
2010010410
2010010506
2015010649
2015010722
2015010812
2015010999
2015011023
比如:2010012325表示在2010年01月23日的气温为25度。

需求:求出每一年的最高温度是哪一天(日期, 最高温度)

这题根据题意可知需要求每一年...所以对年进行分组,相同年份的为一组,分组之后使用max函数就可知最高温度是哪一天。因为最高温度那一天只有一条,所以可以和原表进行笛卡尔积连接,即可得知那一天的的日期和最高温度等。

select 
    a.year year,a.max_temp max_temp,substr(b.data,1,8) day 
from 
    (select 
        substr(data,1,4) year,max(cast(substr(data,-2) as int)) max_temp 
    from test04 
    group by substr(data,1,4)) a 
        join test04 b 
        on a.year=substr(b.data,1,4) and a.max_temp=cast(substr(b.data,-2) as int);

总结:当我们遇到每一,每一个这种字眼时,就需要使用到分组,分组的字段就是跟在这些字眼后面的字段。

5 求TopN,及列转行相关问题

现在有这样一份数据:
1,huangxiaoming,45,a-c-d-f
2,huangzitao,36,b-c-d-e
3,huanglei,41,c-d-e
4,liushishi,22,a-d-e
5,liudehua,39,e-f-d
6,liuyifei,35,a-d-e

字段的意义:
id,name,age,hobby
id,姓名,年龄,爱好

每一条记录中的爱好有多个值,以"-"分隔

需求:求出每种爱好中,年龄最大的两个人(爱好,年龄,姓名)

总体思路:由求出每种爱好中可知要对爱好进行分组,根据年龄最大的两个人可知分组之后对年龄进行倒叙排序,然后取前两个。

因为表中的爱好以a-c-d-f方式存在,这样无法对每种爱好进行分组,我们要想对每种爱好进行分组,那么就必须一行只有一种爱好我们才能求得。所以这里我们就需要列转换成行,就需要用到explode()函数,explode只能有两种类型的参数,如下:

explode(ARRAY): 列表中的每个元素生成一行

explode(MAP):map中每个key-value对,生成一行,key为一列,value为一列

注意:explode()是有很多限制的,限制如下

1、No other expressions are allowed in SELECT  #SELECT中不允许有其他表达式

如:SELECT id, explode(adid_list) AS aa... is not supported

 

2、UDTF's can't be nested   #UDTF不能嵌套

如:SELECT explode(explode(adid_list)) AS aaa... is not supported

 

3、GROUP BY / CLUSTER BY / DISTRIBUTE BY / SORT BY is not supported  #不支持分组排序等

如:SELECT explode(adid_list) AS aaa ... GROUP BY aaa is not supported

,所以经常和lateral view搭配,除以上限制 LATERAL VIEW explode(expression) tableAlias AS columnAlias (',' columnAlias)

这里将爱好explode()炸裂之后,有几个爱好对应就生成几行,那么就需要将原表与炸裂后的爱好进行连接,那么怎么连接呢?原表的数据全都需要所以用原表做连接炸裂后的爱好表,因为炸裂后的就得出一个爱好的字段,无法用其他字段进行关联,那就用array_contains()函数,判断炸裂出来的爱好是否在原始的a-c-d-f中,如果在的话,那么就关联起来。然后再对姓名,年龄,爱好分组,起去重作用。到这就将炸裂后的字段关联上了,因为需求中要保留原表的爱好,年龄,姓名等信息,那么就可以使用窗口函数row_number() over(partition by hobc order by agec desc)对爱好排序,对年龄分组,生成一个新的序列字段。因为窗口函数是除了order外最后执行的,所以我们需要在生成窗户函数的这个表外进行过滤。最终代码如下:

select 
    d.hobc,d.agec,d.namec 
from 
    (select 
        hobc,agec,namec, row_number() over (partition by hobc order by agec desc) as seqs 
    from
        (select 
            b.name as namec,b.age as agec,a.hob as hobc 
        from test05 b 
            left join
            (select 
                explode(hobby) as hob 
            from test05 ) a  
            on array_contains(hobby,hob)
        group by b.name,b.age,a.hob) c
    )d
where d.seqs <=2;

总结:当遇到需求中有最...的几个,前几个这种字眼眼时,就可以用求解TopN的思路去分析。当列中字段的内容是以组合的形式存在,而我们又要对该列中的内中进行分组等操作,就需要使用explode()函数,将列炸裂成行,由于explode()有诸多限制,所以经常会和lateral view一起使用。

6 内置函数的自定义UDF

统计每个月每天出现的情况,比如下面两串数字
0100010101000101010100101010101 这串数字一共31位的,每一位代表某个月的某一天,如电信的号码某一天有通话记录就置成1,没有为0
1101010101010101010100101010100 这串数字一共31位的,每一位代表某个月的某一天,如电信的号码某一天有使用流量记录就置成1,没有为0,

现在是想把这两串数字拼起来,比如第一天,通话标识为0,流量标识为1,我需要的数字是两个标识同一天有1的就置为1,两个1也置为1。结果为 1101010101010101010100101010101

数据:
0100010101000101010100101010101,1101010101010101010100101010100

建表语句:create table test06(day1 string,day2 string) row format delimited fields terminated by "," ;

(1)内置函数实现

思路:将通话记录和流量记录分别用两个表取出来,并使用explode()函数炸裂,并不对炸裂后的结果使用row_number() over() ,生成行号,然后将这两个表根据行号进行左连接查询(有为空的就可以过滤掉),最后再用concat_ws()行数将列转换成行。

最终实现如下:

select 
    concat_ws('',collect_list(cast(dyd as string))) 
from
    (select c.seqs,cast(c.dyc as int)|cast(b.dyb as int) as dyd 
    from 
        (select 
            row_number() over() as seqs,a.dy as dyc
        from 
            (select explode(split(day2,"")) as dy 
            from test06) a
        where a.dy!=''
        order by seqs desc
        ) c
        left join
        (select row_number() over () as seqs,a.dy as dyb
        from 
            (select explode(split(day1,"")) as dy 
            from test06) a
        where a.dy!=''
        order by seqs desc
        ) b
        on c.seqs=b.seqs order by c.seqs desc) d;

(2)自定义UDF临时函数步骤:

①继承 org.apache.hadoop.hive.ql.exec.UDF,重载 evaluate 方法

②打成 jar 包上传到服务器

③将 jar 包添加到 hive 的 classpath            hive>add JAR “jar包在服务器的路径”

④查看jar包是否加入成功,hive> list jar

⑤创建临时函数与开发好的 class 关联起来

hive>create temporary function tolowercase as '类名全路径';

⑥show functions;就可以看多多了一个函数,不过这个为临时函数。

//思路将两串数字遍历一遍,每一为进行或运算,再拼接起来
public class MyUDF extends UDF {public String evaluate(String str1,String str2)throws HiveException {if(str1.length()!=str2.length()) {throw new UDFArgumentTypeException(0,"The lengths of the arguments  are inconsistent");}String[] s1=str1.split("");String[] s2=str2.split("");StringBuffer str = new StringBuffer();for(int i=0;i<s1.length;i++) {if(!s1[i].equals("")) {Integer or=Integer.parseInt(s1[i])|Integer.parseInt(s2[i]);String temp=or.toString();if(temp!=null) {str.append(temp);}}}return str.toString();}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.Redis与python交互

#导入模块、包 from redis import* if __name__"__main__": try: #1.创建StrictRedis对象&#xff0c;与redis服务器建立连接 srStrictRedis() #2、redis正常操作 #添加键py1&#xff0c;值为gj resultsr.set(py1,gj) #输出响…

tcl/tk demo

环境及版本说明: OSX10.9 tclsh -> tclsh8.5 wish -> wish8.5 查看本机运行环境: 1 which wish; 2 /usr/bin/wish 1 which tclsh; 2 /usr/bin/tclsh Demo功能说明: 用户登录窗口,输入用户名,密码.与文件中存储内容校验,如果相等,则提示"登录成功",否则提示&qu…

Hive高级操作

Hive高级操作 1 Hive的数据类型 1.1 原子数据类型 &#xff08;1&#xff09;Hive 是用 Java 开发的&#xff0c;Hive 里的基本数据类型和 java 的基本数据类型也是一一对应的&#xff0c; 除了 String 类型。 &#xff08;2&#xff09;有符号的整数类型&#xff1a;TINYIN…

05.序列模型 W2.自然语言处理与词嵌入(作业:词向量+Emoji表情生成)

文章目录作业1&#xff1a;1. 余弦相似度2. 单词类比3. 词向量纠偏3.1 消除对非性别词语的偏见3.2 性别词的均衡算法作业2&#xff1a;Emojify表情生成1. Baseline model: Emojifier-V11.1 数据集1.2 模型预览1.3 实现 Emojifier-V11.4 在训练集上测试2. Emojifier-V2: Using L…

4.搭建主从

一个master可以拥有多个slave&#xff0c;一个slave又可以拥有多个slave&#xff0c;如此下去&#xff0c;形成了强大的多级服务器集群架构 比如&#xff0c;将ip为192.168.1.10的机器作为主服务器&#xff0c;将ip为192.168.1.11的机器作为从服务器 说明&#xff1a;ip可以换为…

android中给TextView或者Button的文字添加阴影效果

参考&#xff1a; http://blog.csdn.net/hahahacff/article/details/8653171 总结&#xff1a; 可以在代码中实现也可以在xml中实现&#xff1b; XML如下&#xff1a; android:shadowColor"color/black" android:shadowDx"0" android:shadowDy"1"…

LeetCode 688. “马”在棋盘上的概率(DP)

文章目录1. 题目2. 解题1. 题目 已知一个 NxN 的国际象棋棋盘&#xff0c;棋盘的行号和列号都是从 0 开始。即最左上角的格子记为 (0, 0)&#xff0c;最右下角的记为 (N-1, N-1)。 现有一个 “马”&#xff08;也译作 “骑士”&#xff09;位于 (r, c) &#xff0c;并打算进行…

5.搭建集群

1.配置机器1 在演示中&#xff0c;192.168.12.107为当前ubuntu机器的ip 在192.168.12.107上进入Desktop目录&#xff0c;创建redis目录 在redis目录下创建文件7000.conf&#xff0c;编辑内容如下 port 7000 bind 192.168.12.107 daemonize yes pidfile 7000.pid cluster-enabl…

知识管理系统

一 &#xff1a;概述知识管理中&#xff0c; 一般是设定学习目标&#xff0c; 有针对性的收集材料&#xff0c;然后学习更有效&#xff1b;另外如见到以前总结过的内容&#xff0c; 并对自己有启发的也可以保存&#xff0c; 以修改以前写过的文章&#xff1b;而学习目标是什么&…

LeetCode 第 36 场双周赛(304/2204,前13.8%)

文章目录1. 比赛结果2. 题目1. LeetCode 5515. 设计停车系统 easy2. LeetCode 5516. 警告一小时内使用相同员工卡大于等于三次的人 medium3. LeetCode 5518. 给定行和列的和求可行矩阵 medium4. LeetCode 5517. 找到处理最多请求的服务器 hard1. 比赛结果 做出来3题&#xff0…

数据库实例:用户注册

1.根据结构创建表的脚本如下 createtable py_users( id int unsigned auto_increment not null primary key, uname varchar(20) not null, upwd char(40) not null, is_delete bit not null default 0 ); 如下流程图&#xff0c;接下来的代码就按照这个逻辑来写 2.创建user…

android 应用在启动后进行全局的的初始化操作

例如对于Volley的使用&#xff1a; 1&#xff1a;定义一个类使其继承Application package com.wzh.app;import com.wzh.volley.WzhVolley; import android.app.Application; import android.util.Log;public class WzhShshtApp extends Application{Overridepublic void onCrea…

HBase原理

目录 HBase原理 1 HBase架构 2 HBase中的核心概念 3 HBase的存储机制 4 HBase的寻址机制 5 HBase的读写流程 6 HBase的设计 7 HBase和Hive的整合 HBase原理 1 HBase架构 HBase的架构为主从架构&#xff0c;HMaster为主节点&#xff0c;HRegionServer为从节点 &#x…

数据库实例:用户登录

如下遍流程图&#xff0c;接下来的代码就按照这个逻辑来写 创建user_login.py文件&#xff0c;代码如下 #codingutf-8 from MySQLdb import* from hashlib importsha1 if __name____main__: try: #接收输入用户名、密码 unameraw_input(请输入用户名&…

javascript自定义startWith()和endWith()方法

一、采用正则表达式实现startWith、endWith效果函数 String.prototype.startWithfunction(str){ var regnew RegExp("^"str); return reg.test(this); } //测试ok&#xff0c;直接使用str.endWith("abc")方式调用即可String.prototyp…

数据库实例:mysql与mongo结合用户登录

加入mongodb后登录逻辑如下图&#xff0c;将图中nosql的位置换为mongodb即可 用户数据存储的集合名称为py_users&#xff0c;文档格式为{uname:用户名,upwd:密码} 将原来MySQL操作的代码封装到一个方法中&#xff0c;代码如下 def mysql_login(): #mongodb中没有则到mysql中…

LeetCode 1609. 奇偶树(层序遍历)

文章目录1. 题目2. 解题1. 题目 如果一棵二叉树满足下述几个条件&#xff0c;则可以称为 奇偶树 &#xff1a; 二叉树根节点所在层下标为 0 &#xff0c;根的子节点所在层下标为 1 &#xff0c;根的孙节点所在层下标为 2 &#xff0c;依此类推。偶数下标 层上的所有节点的值都…

关于怀旧

每次换季都正好对个人资产进行更新换代的时候&#xff0c;上一年收拾东西的心情还依然记得&#xff0c;只是今年更加伤感。 上一年的我&#xff0c;爱情甜蜜&#xff0c;生活丰富&#xff0c;实验室项目也开展得十分顺利&#xff0c;整理东西时每打开一个箱子&#xff0c;就惊叹…

数据的特征工程

数据的特征工程 1 什么是数据的特征工程 特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程&#xff0c;从而提高了对未知数据的模型准确性。 特征工程的意义&#xff1a;将直接影响模型的预测结果。 2 数据的来源与类型 2.1 数据的来源 企业日益积累…

数据库实例:mysql与redis结合用户登录

加入redis后登录逻辑如下图&#xff0c;将图中nosql的位置换为redis即可 用户数据存的键为用户名&#xff0c;值为密码 将原来MySQL操作的代码封装到一个方法中&#xff0c;代码如下 defmysql_login(): #redis中没有则到mysql中查询 sqlselect upwd from py_users wher…