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,一经查实,立即删除!

相关文章

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…

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

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

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…

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(请输入用户名&…

数据库实例: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;依此类推。偶数下标 层上的所有节点的值都…

数据的特征工程

数据的特征工程 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…

LeetCode 1610. 可见点的最大数目(atan2函数求夹角)

文章目录1. 题目2. 解题1. 题目 给你一个点数组 points 和一个表示角度的整数 angle &#xff0c;你的位置是 location &#xff0c;其中 location [posx, posy] 且 points[i] [xi, yi] 都表示 X-Y 平面上的整数坐标。 最开始&#xff0c;你面向东方进行观测。你 不能 进行…

[翻译]API Guides - Bound Services

官方文档原文地址&#xff1a;http://developer.android.com/guide/components/bound-services.html 一个Bound Service是一个客户端-服务器接口的服务。一个Bound Service允许组件&#xff08;像activity&#xff09;绑定一个service&#xff0c;发送请求&#xff0c;接受结果…

sklearn数据集与估计器

sklearn数据集与估计器 1 sklearn数据集 &#xff08;1&#xff09;数据来源&#xff1a;大多数以文件的形式 &#xff08;csv文件..&#xff09;, 因为mysql有性能瓶颈、读取速度遭到限制&#xff0c;数据大的时候很费时间 &#xff08;2&#xff09;读取数据的工具&#…

LeetCode 935. 骑士拨号器(动态规划)

文章目录1. 题目2. 解题1. 题目 国际象棋中的骑士可以按下图所示进行移动&#xff1a; 这一次&#xff0c;我们将 “骑士” 放在电话拨号盘的任意数字键&#xff08;如上图所示&#xff09;上&#xff0c; 接下来&#xff0c;骑士将会跳 N-1 步。每一步必须是从一个数字键跳到…

k近邻算法(KNN)-分类算法

k近邻算法(KNN)-分类算法 1 概念 定义&#xff1a;如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别&#xff0c;则该样本也属于这个类别。 k-近邻算法采用测量不同特征值之间的距离来进行分类。 2 优缺点 优点&#xff1a;简单&a…

LeetCode 822. 翻转卡片游戏(哈希)

文章目录1. 题目2. 解题1. 题目 在桌子上有 N 张卡片&#xff0c;每张卡片的正面和背面都写着一个正数&#xff08;正面与背面上的数有可能不一样&#xff09;。 我们可以先翻转任意张卡片&#xff0c;然后选择其中一张卡片。 如果选中的那张卡片背面的数字 X 与任意一张卡片…

朴素贝叶斯算法-分类算法

朴素贝叶斯算法-分类算法 1 概率基础 概率定义为一件事情发生的可能性 联合概率&#xff1a;包含多个条件&#xff0c;且所有条件同时成立的概率&#xff0c;记作P(A,B) 条件概率&#xff1a;事件A在另一个事件B已经发生条件下的发送概率&#xff0c;记作P(A|B) 在A1,A2相…

django简介及环境搭建

MVC简介 MVC框架的核心思想是&#xff1a;解耦&#xff0c;让不同的代码块之间降低耦合&#xff0c;增强代码的可扩展性和可移植性&#xff0c;实现向后兼容 M全拼为Model&#xff0c;主要封装对数据库层的访问&#xff0c;内嵌ORM框架&#xff0c;实现面向对象的编程来操作数据…