hive(三) -- 基础语法及导入导出

HQL基础语法

Hive中的语句叫做HQL语句,是一种类似SQL的语句,基本上和SQL相同但是某些地方也是有很大的区别.

数据库操作

创建数据库

  • 1.创建一个数据库,数据库在HDFS上的默认存储路径是/hive/warehouse/*.db。
create database hive01;
  • 避免要创建的数据库已经存在错误,增加if not exists判断。(标准写法)
create database if not exists hive01;
  • 创建数据库指定位置
create database if not exists hive01 location '/hive01.db';

修改数据库

用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。

alter database hive01 set dbproperties('createtime'='20220727');

查看数据库

  • 显示所有数据库
show databases;
  • 显示数据库使用like过滤
show databases like 'h*';
  • 查看数据库详情
desc database hive01;
describe database extended hive01 ; -- 带属性
  • 切换数据库
use hive01;

删除数据库

  • 最简写法
drop database hive01;
  • 如果删除的数据库不存在,最好使用if exists判断数据库是否存在。否则会报错:FAILED:SemanticException [Error 10072]: Database does not exist: db_hive
drop database if exists hive01;
  • 如果数据库不为空,使用cascade命令进行强制删除
drop database if exists hive01 cascade;

Hive数据类型

Hive数据类型指的是表中列的字段类型;

整体分为两类︰原生数据类型( primitive data type)和复杂数据类型( complex data type ) 。

原生数据类型包括:数值类型、时间日期类型、字符串类型、杂项数据类型.

复杂数据类型包括:array数组、map映射、struct结构.

原生数据类型

Java数据类型 Hive数据类型 长度
byte TINYINT 8位有符号整型。取值范围:-128~127。
short SMALLINT 16位有符号整型。取值范围:-32768~32767。
int INT 32位有符号整型。取值范围:-2 31 ~2 31 -1。
long BIGINT 64位有符号整型。取值范围:-2 63 +1~2 63 -1。
boolean BOOLEAN 布尔类型,true或者false
float FLOAT 单精度浮点数
double DOUBLE 双精度浮点数
varchar(n) 变长字符类型,n为长度。取值范围:1~65535。
 char(n) 固定长度字符类型,n为长度。最大取值255
String string 字符串类型
DATE 日期类型,格式为 yyyy-mm-dd .
DATETIME 日期时间类型。 精确到毫秒
TIMESTAMP 时间戳

对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。

隐式类型转换

  • 与标准SQL类似,HQL支持隐式和显式类型转换。
  • 原生类型从窄类型到宽类型的转换称为隐式转换,反之,则不允许。
  • 下表描述了类型之间允许的隐式转换∶

image

强制类型转换

使用CAST函数 cast(数据 as 新类型)

select cast( '100' as double); 会将100字符串转换为100整数值。
如果强制转换失败,例如select cast ('aa' as int );,该函数返回NULL。

复杂数据类型

类型 定义 演示
Array array array(1,2,3,4)
Map map<string, string> map("k1","v1","k2","v2")
Struct struct<x:int, y:int> named_struct(‘x’:1, 'y’:2)

Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

数据库表基本操作

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 DELIMITED | SERDE serde_name WITH SERDEPROPERTIES(property_name=property_value,..)] 
[STORED AS file_format] 
[LOCATION hdfs_path]


[] 中括号的语法表示可选。
|  表示使用的时候,左右语法二选一。
建表语句中的语法顺序要和语法树中顺序保持一致。

字段简单说明
-  CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项 来忽略这个异常。
-  EXTERNAL  外部表
-  COMMENT: 为表和列添加注释。
-  PARTITIONED BY 创建分区表
-  CLUSTERED BY 创建分桶表
-  SORTED BY  排序不常用
- ROW FORMAT DELIMITED 使用默认序列化LazySimpleSerDe 进行指定分隔符
- SERDE 使用其他序列化类 读取文件
- STORED AS 指定文件存储类型
- LOCATION 指定表在HDFS上的存储位置。
- LIKE 允许用户复制现有的表结构,但是不复制数据

根据数据创建表

案例1:简单用户信息

1,admin,123456,男,18
2,zhangsan,abc123,男,23
3,lisi,654321,女,16
use hive01;

create table t_user(
    id int,
    uname string,
    pwd string,
    sex string,
    age int )
row format delimited fields terminated by ','; --指定 字段之间用 , 分隔

当我们创建表后 在HDFS上会产生对应的文件夹 
/user/hive/warehouse/hive01.db/t_user
但是此时里面没有任何文件 
我们可以将user.txt文件上传到这个位置

select  * from t_user;
+------------+---------------+-------------+-------------+-------------+
| t_user.id  | t_user.uname  | t_user.pwd  | t_user.sex  | t_user.age  |
+------------+---------------+-------------+-------------+-------------+
| 1          | admin         | 123456      | 男           | 18          |
| 2          | zhangsan      | abc123      | 男           | 23          |
| 3          | lisi          | 654321      | 女           | 16          |
+------------+---------------+-------------+-------------+-------------+

案例2:复杂人员信息

liuyan,tangtang_mimi,liuliu:18_yanyan:14,hui long guan_beijing
jinlian,dalang_qingqing,jinjin:18_lianlian:19_aa:20,chao yang_beijing

结构

{
    "name": "liuyan",
    "friends": ["tangtang" , "mimi"] ,       //列表Array, 
    "children": {                      //键值Map,
        "liuliu": 18 ,
        "yanyan": 14
    }
    "address": {                      //结构Struct,
        "street": "hui long guan" ,
        "city": "beijing" 
    }
}

建表

create table test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
-- 语法解释
row format delimited fields terminated by ','  -- 列分隔符
collection items terminated by '_'  	-- MAP STRUCT 和 ARRAY 的分隔符(数据分割符号)
map keys terminated by ':'				-- MAP中的key与value的分隔符

复杂类型查询操作

1.数组

- arr[index]   取值
- size(arr)     长度
- 数组角标越界返回NULL
- explode(arr)

select name,friend[0],friend[1],friend[2] from t_user2;
+----------+-----------+-----------+-------+
|   name   |    _c1    |    _c2    |  _c3  |
+----------+-----------+-----------+-------+
| liuyan   | tangtang  | mimi      | NULL  |
| jinlian  | dalang    | qingqing  | NULL  |
+----------+-----------+-----------+-------+

select name,size(friend) as frendsize from  t_user2;
+----------+------------+
|   name   | frendsize  |
+----------+------------+
| liuyan   | 2          |
| jinlian  | 2          |
+----------+------------+

2.Map

map_keys(字段)  所有key
map_values(字段) 所有value

select map_keys(children),map_values(children) from t_user2;
+------------------------+----------+
|          _c0           |   _c1    |
+------------------------+----------+
| ["liuliu","yanyan"]    | [18,14]  |
| ["jinjin","lianlian"]  | [18,19]  |
+------------------------+----------+
select map_keys(children)[0],map_values(children)[0] from t_user2;
+---------+------+
|   _c0   | _c1  |
+---------+------+
| liuliu  | 18   |
| jinjin  | 18   |
+---------+------+
-- 根据key获取值
select children['liuliu'] from t_user2
+-------+
|  _c0  |
+-------+
| 18    |
| NULL  |
+-------+

3.Struct

select name,address.city,address.street from t_user2;
+----------+----------+---------------+
|   name   |   city   |    street     |
+----------+----------+---------------+
| liuyan   | beijing  | huilong guan  |
| jinlian  | beijing  | chao yang     |
+----------+----------+---------------+

Hive读写文件机制

Hive读取文件机制︰首先调用InputFormat(默认TextInputFormat ),返回一条一条kv键值对记录(默认是一行对应一条键值对)。然后调用SerDe(默认LazySimpleSerDe )的Deserializer,将一条记录中的value根据分隔符切分为各个字段。
Hive写文件机制:将Row写入文件时,首先调用SerDe(默认LazySimpleSerDe )的Serializer将对象转换成字节序列,然后调用OutputFormat将数据写入HDFS文件中。

SerDe:Serializer,DeSerializer.
image

image

当我们使用 row format delimited时 使用默认的LazySimpleSerDe类来处理数据。

如果数据文件格式比较特殊可以使用ROW FORMAT SERDE serde_name指定其他的Serde类来处理数据,甚至支持用户自定义SerDe类。

image

LazySimpleSerDe是Hive默认的序列化类,包含4种子语法,分别用于指定字段之间、集合元素之间、map映射 kv之间、换行的分隔符号。在建表的时候可以根据数据的特点灵活搭配使用。

image

Hive建表时如果没有row format语法指定分隔符,则采用默认分隔符;

默认的分割符是' \001',是一种特殊的字符,使用的是ASCII编码的值,键盘是打不出来的。

在vi编辑器中,连续按下Ctrl+v/Ctrl+a即可输入'\001',显示^A, 在文本编辑器中将以SOH的形式显示

Location指定文件位置

Hive表默认的存储路径是通过hive-site.xml配置文件中hive.metastore.warehouse.dir属性指定的.

# 默认位置
/user/hive/warehouse

创建数据库,就会在warehouse下产生一个xx.db的文件夹,在哪个库下创建表,就会在对应的文件夹下产生对应表的文件夹.当然这是默认情况 我们可以在创建表时使用Location来指定表的位置.

create table t_user_location(
    id int,
    uname string,
    pwd string,
    sex string,
    age int )
row format delimited fields terminated by ','
location "/aaa";  -- 这里指定在根目录下的aaa文件夹

将数据上传到aaa文件夹中
hdfs dfs -put user.txt /aaa

Location可以指定创建库的位置 也可以指定创建表的位置.

查询修改删除表

-- 显示表信息
show tables;
show tables like '*user*';

desc t_user;   --字段  类型
desc formatted t_user;  -- 表详细信息

-- 修改表名
-- alter table old_table_name rename to new_table_name
-- alter table test02 rename to test;

--  添加列
-- alter table 表名  add  列名 数据类型;


-- 修改列
-- alter table 表名 change 旧列名 新列名 数据类型



-- 删除列  想删除哪列 就不写哪列 这里的删除就是用 ()中的内容替换原本的内容
select * from t_user_location;
alter  table  t_user_location replace columns (
    id int,
    uname string,
    pwd string,
    sex string);


-- 删除表
-- drop table 表名;

数据的导入

直接放到对应目录
当我们创建好一张表后,会有对应的文件夹 默认位置 /user/hive/warehouse/xx.db/表名
我们之前的方式是通过put或者mv直接将文件放入到对应的文件夹下 

user.txt
1,admin,123456,男,18
2,zhangsan,abc123,男,23
3,lisi,654321,女,16

use hive01;

create table t_user_import(
    id int,
    uname string,
    pwd string,
    sex string,
    age int
)row format delimited fields terminated by ',';

我们可以直接将user.txt 上传到指定的位置 
hdfs dfs -put user.txt /user/hive/warehouse/hive01.db/t_user_import
也可以将hdfs上的数据 移动 或者复制到指定的位置
hdfs dfs -mv  /user.txt /user/hive/warehouse/hive01.db/t_user_import
hdfs dfs -cp  /user.txt /user/hive/warehouse/hive01.db/t_user_import

表的文件夹下可以有多个文件 都可以显示
使用load方式

相比较直接暴力放数据的行为 官方更推荐使用load的方式加载数据.

将本地文件加载到对应表 注意:此处的本地不是客户端的本地 指的是HS2服务所在的主机的本地.

指定LOCAL,将在本地文件系统中查找文件路径。
若指定相对路径,将相对于用户的当前工作目录进行解释;
用户也可以为本地文件指定完整的URI-例如:file:///root/user.txt
/*
语法
     加载本地文件到 表  注意 这里的本地并不是客户端本地 而是hiveserver2所在的计算机
     load data local inpath '本地文件' into table  表名;  //不覆盖原有数据 如果有相同文件会自动改名
     load data local inpath '本地文件' overwrite into table  表名; //覆盖原有数据
    加载hdfs文件到 表
     load data  inpath '本地文件' into table  表名;  //不覆盖原有数据 如果有相同文件会自动改名
     load data  inpath '本地文件' overwrite into table  表名; //覆盖原有数据
 */
create table t_user_load(
    id int,
    uname string,
    pwd string,
    sex string,
    age int
)row format delimited fields terminated by ',';

-- 注意这是一个复制操作 本地的user.txt还存在   
load data local inpath "/root/user.txt" into table t_user_load;
-- 同名文件可以多次执行 会自动改名
load data local inpath "/root/user.txt" into table t_user_load;
-- 查询没有任何问题
select * from t_user_load;

-- 如果加上 overwite 会将原本文件中的所有文件覆盖
load  data local inpath "/root/user.txt" overwrite into table t_user_load;
-- 查询时只显示最后一次添加的内容
select * from t_user_load;

将HDFS文件加载到对应表 也不一定是HDFS也可以是其他文件系统

没有指定LOCAL关键字 如果filepath指向的是一个完整的URI,会直接使用这个URI 
如果没有指定schema,Hive会使用在hadoop配置文件中参数fs.defaultFS指定的(不出意外,都是HDFS)。

-- 将hdfs上的根目录的user.txt 加载  注意这是一个移动的动作 原本位置的文件没有了
load data  inpath "/user.txt" into table t_user_load;
-- 加上overwirte还是覆盖操作
load data  inpath "/user.txt" overwrite into table t_user_load;
使用insert+select

使用insert into values方式虽然也可插入数据,但是插入的数据量小,每次都需要执行MR程序效率低下,不推荐使用.

insert into t_user_load values(1,'admin','123','男',100);

-- 如果报错  FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.StatsTask
set hive.txn.stats.enabled=false
set hive.stats.autogather=false

我们可以使用insert+select方式

insert+select表示:将后面查询返回的结果作为内容插入到指定表中,注意OVERWRITE将覆盖已有数据。需要保证查询结果列的数目和需要插入数据表格的列数目一致.如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但是不能保证转换一定成功,转换失败的数据将会为NULL。

create table test_insert(
    id int,
    name string
)row format delimited fields terminated by ",";

查询user表的id和name 将结果保存到test_insert中;
insert into table test_insert select id,uname from t_user_load;

查询user表的id和name 将结果保存到test_insert中 将原有数据覆盖
insert overwrite table  test_insert select id,uname from t_user_load;

Multiple Inserts 多重插入 核心:一次扫描,多次插入 目的就是减少扫描的次数 完成多次insert操作.

create table test_insert02(
    id int
)row format delimited fields terminated by ",";

create table test_insert03(
    name string
)row format delimited fields terminated by ",";

我想将user表中id一列插入到  test_insert02 表中 将user表中name一列插入到test_insert03表中.
我们可以这样写

insert into table  test_insert02 select id from t_user;
insert into table  test_insert03 select uname from t_user;
但是这样的话 会扫描t_user两次 

一次扫描,多次插入
from t_user
insert into table test_insert02
select id
insert into table test_insert03
select uname;
查询创建表加载
/*
	 create table 表名 as select 列名,列名 from 表;
*

create  table  t_tmp  as  select id , uname , age from t_user ;
使用import导入

export将表中的数据导出到指定的目录下 / 保持表原来的目录结构

使用import快速的导入数据到表中

用于数据的备份和迁移 , 导入的数据必须是export导出的数据

-- 将t_user数据导出到hdfs上 /aaa 文件夹中
export table t_user to '/aaa';
-- 创建表t_user_import 和t_user结构一样
create table t_user_import02 like t_user;
-- 使用import将导出的数据导入到 t_user_import02表中
import  table t_user_import02 from '/aaa'

数据的导出

insert导出

Hive支持将select查询的结果导出成文件存放在文件系统。注意:导出操作是一个OVERWRITE覆盖操作,慎重。

    格式
        -- 将查询的结果 导出到本地文件夹
        insert overwrite local directory '本地文件夹名' select 查询语句;
        -- 将查询的结果 导出HDFS 不写local
        insert overwrite  directory 'HDFS文件夹名' select 查询语句;

导出到本地

-- 将t_user表中的数据 导出到本地文件夹 这是一个覆盖操作 会覆盖指定文件夹下的所有 如果指定为/ 那么废了
insert overwrite local directory '/data/output' select * from t_user;

--以这种方式导出的文件是使用的是默认分隔符 '\001'
--我们可以自己指定分隔符
insert overwrite local directory '/data/output2'
row format delimited fields terminated by ',' 
select * from t_user;

导出到HDFS

-- 不写local导出到hdfs上 实际上使用的是 hadoop配置文件中参数fs.default.name设置的值
insert overwrite  directory '/data/output2'
row format delimited fields terminated by ',' 
select * from t_user;
其他导出方式
只要将数据获取出来保存即可 
可以选择使用hadoop下载命令 
 hdfs dfs -get /user/hive/warehouse/hive01.db/t_user  /data
 可以使用hive shell命令
 hive  -e  "use hive01 ; select * from t_user ;"  >>  res.data  保存sql结果
 Export导出到HDFS上
 export table t_user to '/aaa';
本文转载于网络 如有侵权请联系删除

相关文章

  • Redis的基础知识

    数据类型及相关操作String类型特点:字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。添加1. 插入:t添加一条数据的命令如下,其中key为主键,而value是值。setkeyvalue2. 设置过期时间给指定的key设置过期时间,key为指定的键,seconds为过期的时间长度,value为值,该命令是在新增数据的时候指定过期时间。setexkeysecondsvalue3. 多值添加一次性添加多条数据,使用如下命令,mset后面跟着多条数据,格式为key-value的形式中间用空格隔开。msetkey1value1key2value2...4.指定key的追加在创建完一条数据后,如需在该key对应的value后追加信息,可用该命令来完成。appendkeyvalue获取1.根据key获取根据指定的key获取对应的值,可使用如下命令。getkey2.多key获取一次性获取多个key对应的值。mget

  • 解决swoft框架redis序列化问题

    在swoft框架中使用redis缓存,写入字符串到rediskey中,结果发现get出来的值,前面多了一串代码,仔细一看,是被序列化后的值保存在了redis中,那么是什么原因,让redis在set字符串时,默认序列化字符串了呢?Redis::set('name','hello'); echoRedis::get('name');复制结果:s:5:"hello";复制写入的是hhjj,怎么get出来被序列化了呢?这明显不是我们想要的值,其实在swoft官方文档中,有了一个对序列器解释:serializer:序列器,支持以下四种方式。不使用请设置为Redis::SERIALIZER_NONE或0。Redis::SERIALIZER_PHP:PHP默认序列器Redis::SERIALIZER_IGBINARY:需安装Igbinary扩展并启用Redis::SERIALIZER_MSGPACK:需安装MessagePack扩展并启用Redis::SERIALIZER_JSON:需安装Json扩展(一般情况下默认已安

  • 白话Elasticsearch38-深入聚合数据分析之案例实战 下钻分析之统计每季度每个品牌的销售额

    概述继续跟中华石杉老师学习ES,第38篇课程地址:https://www.roncoo.com/view/55案例需求:统计每季度每个品牌的销售额原始数据: Step1.先按照季度进行bucket分组首先按照季度bucket分组,使用date_histogram,季度interval->quarterGET/tvs/sales/_search { "size":0, "aggs":{ "group_by_sold_date":{ "date_histogram":{ "field":"sold_date", "interval":"quarter", "min_doc_count":0, "format":"yyyy-MM-dd", "extended_bounds":{ "min":"2016-04-01&quo

  • 零基础学Flink:CEP复杂事件处理

    上一篇文章,我们介绍了UDF,可以帮用户自定义函数,从而在使用FlinkSQL中,能够得心应手的处理一些数据问题。今天我们来学习一下Flink是如何处理CEP问题的。本文会分为两个部分,概念介绍部分和代码案例部分。概念介绍那么什么是CEP?CEP即Complexeventprocessing,引用wiki的解释:CEP,iseventprocessingthatcombinesdatafrommultiplesourcestoinfereventsorpatternsthatsuggestmorecomplicatedcircumstances.Thegoalofcomplexeventprocessingistoidentifymeaningfulevents(suchasopportunitiesorthreats)andrespondtothemasquicklyaspossible.FlinkCEP(理论基础《EfficientPatternMatchingoverEventStreams》,对该片论文有兴趣的同学,可以找我索取)是构建在DataStreamAPI上的,首先需要用

  • 玩转机器学习:基于多损失函数的模型融合

    基于多损失函数的模型融合原理其实很简单,利用不同损失函数的特性,结合使用不同损失函数分别训练多个模型,将多个训练得到的模型结果进行加权平均或分段预测。这里我们使用的是MAE和MSE:平均绝对差值(MAE)绝对误差的平均值,通常用来衡量模型预测结果对标准结果的接近程度。来源见水印均方误差(MSE)参数估计值与参数值之差的平方的期望值。 来源见水印可以看出,MSE对误差进行了平方,这就会放大误差之间的差距,也即加大对异常值的惩罚,在高分段和低分段能获得更好的表现,使用MAE的模型在中分段能获得更好的表现。因此可以结合使用以MSE和MAE为损失函数的模型,分段进行预测。注:单模型而言,如果数据的异常值对于业务是有用的,我们希望考虑到这些异常值,那么就用MSE。如果我们相应异常值只是一些无用的数据噪音,那就用MAE。模型融合实例书中使用lightgbm建模并进行融合,只列出关键代码。

  • Python 程序打包工具:py2exe 和 PyInstaller

    通常执行python程序要有相应的Python环境,但某些特定场景下,我们可能并不愿意这么麻烦的去配置这些环境(比如将写好的脚本发给客户进行操作),如果可以提前将程序打包成Windows平台的.exe文件或者是Linux下的.sh脚本,那么使用起来就会方便很多,py2exe和PyInstaller这两款工具都是干这么个事的,下面以hello.py脚本(代码内容如下)为例进行介绍。age=input("Howoldareyou?\n") print("A:"+age)复制提示:PyInstaller可以在Windows和Linux下使用,更推荐使用,而py2exe暂不支持Linux平台 PyInstaller安装pipinstallpyinstaller使用PyInstaller常见的用法有:生成单个可执行文件:pyinstaller-Fhello.py生成指定icon的可执行文件:pyinstaller-ixxx.icohello.py在当前目录下的dist文件夹内可以找到生成后的可执行文件(脚本),更多用法请参考说明 py2exe安装pipin

  • 编译时注解(三)Arouter源码讲解

    项目中我们有时需要跨模块startActivity,但是这样需要配置menifest,不方便。这时就需要阿里的一个路由框架Arouter Arouter的使用就不再多说了。这篇文章主要讲解他的源码1.初始化ARouter.init(this);publicstaticvoidinit(Applicationapplication){ if(!hasInit){ logger=_ARouter.logger; _ARouter.logger.info(Consts.TAG,"ARouterinitstart."); hasInit=_ARouter.init(application);//********* if(hasInit){ _ARouter.afterInit();//********* } _ARouter.logger.info(Consts.TAG,"ARouterinitover."); } }复制_ARouter.afterInit();里面就下面一句,初始化拦截器服务 interceptorService=(Intercept

  • onclicklistener到底怎么用?

    相信很多像我一样的新手学习Android开发会遇到这个问题,通过这几天的归类和总结,将我的理解写在下面,欢迎大家一起前来讨论:以按钮BUTTON的监听事件为例,以下的监听实现都是等价的:1.使用接口继承按钮监听方法1importandroid.app.Activity; 2importandroid.os.Bundle; 3importandroid.view.View; 4importandroid.widget.Button; 5importandroid.widget.TextView; 6 7/*这里接口继承的方法是隶属于按钮BUTTON的,因此前面导入的头文件只需有BUTTON即可*/ 8publicclassHello_to_worldActivityextendsActivityimplementsButton.OnClickListener{ 9/**Calledwhentheactivityisfirstcreated.*/ 10privateButtonbtn_say_hello; 11privateTextViewhello_world; 12 13@Overri

  • 教你如何用Python写一个小游戏

    引言最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏、后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下其中的有趣之处。本次开发的游戏叫做alieninvasion。安装pygame并创建能左右移动的飞船安装pygame本人电脑是windows10、python3.6,pygame下载地址:传送门 请自行下载对应python版本的pygame 运行以下命令$pipinstallwheel $pipinstallpygame‑1.9.3‑cp36‑cp36m‑win_amd64.whl复制创建Pygame窗口及响应用户输入新建一个文件夹alien_invasion,并在文件夹中新建alien_invasion.py文件,输入如下代码。importsys importpygame defrun_game(): #initializegameandcreateadispalyobject pygame.init() screen=pygame.display.set_mode((1200,800))

  • 腾讯云容器安全服务删除安全合规忽略项,资产+检测项列表api接口

    1.接口描述接口请求域名:tcss.tencentcloudapi.com。 移除安全合规忽略(资产+检测项)列表,不显示指定的检查项包含的资产内容参考的AddCompliancePolicyAssetSetToWhitelist,除输入字段外,其它应该是一致的,如果有不同可能是定义的不对 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:DeleteComplianceAssetPolicySetFromWhitelist。 Version 是 String 公共参数,本接口取值:2020-11-01。 Region 否 String 公共参数,本接口不需要传递此参数。 AssetItemId 是 Integer 资产ID C

  • 微信小程序 Page构造函数重写

    //utils/utils.js复制 constoldPage=Page; console.log(oldPage) Page=function(app){  //定义新函数  app.newShow=function(options){    console.log('我是自定义生命周期函数');  } 复制 onLoad:function(options){ //页面创建时执行 }, onShow:function(){ //页面出现在前台时执行 }, onShareAppMessage:function(){ //页面被用户分享时执行 }, 复制 returnoldPage(app)}复制 页面使用 require('../../utils/utils.js'); constapp=getApp() Page({ //.... })复制  

  • 扯一会

    德是为人之本,当遇到事情无法做出抉择时需要从德的角度出发一般不会出现错误或则大的错误,在与人相处时品德也很重要,什么是品德呢?德就是人品,怎么看出一个人的品性呢?就从日常待人待事即可,怎么看出待人待事呢,一要有敬畏之心二是感恩之心三既冷静与否, 什么是敬畏呢 《中庸注》中说:君子之心,常存敬畏 ,人活着不能随心所欲,而要心有所惧,怀有这种心理,它能让人懂得自警与自省,它还有助于人规范与约束自己的言行举止,它还具有促进人与人和谐,存敬畏,并不是叫人不敢想,不敢说,不敢做,而是叫人想之有道,说之在理,做之合法。也即是说,该想的想,该说的说,该做的做。这样,心存敬畏,才更有意义,随心所欲则会得不到他人的理解久而久之造成心理缺陷。 感恩是人性善的反映;感恩,是一种品德,是一种生活态度,是一种健康的心态,是一种做人的境界,学会感恩,就是要学会懂得尊重他人,学会感恩做一个乐于奉献的人就是让你知道如何享受快乐生活反之则会路越来越小造成心理缺陷。 冷静的人是素质的体现是一种阅历,反之事情则会越来越糟糕造成心理缺陷。 所以走势是:性格>心理>品性>外貌。 

  • hdu 3507 Print Article(dp+斜率优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507   题解:显然这题的递推很容易得到 dp[i]=dp[j]+(sum[i]-sum[j])^2+m 显然这样的要两个for肯定超时。这里就要用到斜率优化。 不妨设k<j<i; 显然这里j是最优解所以dp[j]+m+(sum[i]-sum[j])^2<dp[k]+m+(sum[i]-sum[k])^2化简一下就是 (dp[j]+num[j]^2-(dp[k]+num[k]^2))/(2*(num[j]-num[k]))<sum[i],设yj=dp[j]+num[j]^2,yk=dp[k]+num[k],xj=2*num[j],xk=2*num[k] 那么就是(yj-yk)/(xj-xk)<sum[i];这时候是j为k道i之间的最优解 不妨设g[j,k]=(yj-yk)/(xj-xk) 依旧设k<j<i; 如果g[i,j]<g[j,k],那么j点便永远不可能成为最优解 当g[i,j]<sum[i],那么就是说i点要比j点优,

  • 俄罗斯方块游戏

    俄罗斯方块游戏 代码托管 参考链接:大佬的源代码 我对其中的修改是字体的修改,我用了与原版不一样的字体 效果如下: 可能有些看不太清,但这也是我头一次写游戏,有很多方面还很生疏,希望通过学习能够越来越好!

  • caffe训练时报错

    转自:https://www.cnblogs.com/haiyang21/p/7614669.html F071715:17:20.2542098400math_functions.cu:121]Checkfailed:status==CUBLAS_STATUS_SUCCESS(11vs.0)CUBLAS_STATUS_MAPPING_ERROR ***Checkfailurestacktrace:*** @0x7fbe7ed3a5cdgoogle::LogMessage::Fail() @0x7fbe7ed3c433google::LogMessage::SendToLog() @0x7fbe7ed3a15bgoogle::LogMessage::Flush() @0x7fbe7ed3ce1egoogle::LogMessageFatal::~LogMessageFatal() @0x7fbe7f5563cacaffe::caffe_gpu_asum<>() @0x7fbe7f54a8a7caffe::SoftmaxWithLossLayer<>::Forw

  • 关于分频和降频

    引言 在学习FPGA时,在野火的课程中学习到了关于分频和降频两个有点相似的东西,在此记录 下列所有图片均来自于野火图书 点击访问野火图书 分频 百度百科: 分频器是指使输出信号频率为输入信号频率整数分之一的电子电路。对于任何一个N次分频器,在输入信号不变的情况下,输出信号可以有2pi/N的相位。这种现象是分频作用所固有的,与分频器的具体电路无关,称为分频器输出相位多值性 简言之,分频就是将频率变为原来的1/n,根据n为偶数和奇数,又分为偶分频和奇分频 偶分频波形图 对于奇分频来说,要利用分频方式实现比较麻烦,对应野火的波形图 降频 其实和分频实现的效果是一样的,但是他们的波形图不同,这也意味着,他们的应用场合不是完全相同的,虽然我还没有遇到 对于降频来说,奇分频和偶分频实现起来的不差不多,所以就给出偶分频的波形图,奇分频照着画一下就出来了,还能加深印象 意义 那么这两个都差不多,那他们为什么还要弄一个降频一个分频,这不是麻烦人嘛QAQ 在FPGA中凡是时钟信号都要连接到全局时钟网络上,全局时钟网络也称为全局时钟树,是FPGA厂商专为时钟路径而特殊设计的,它能够使时钟信号

  • 周一s:E - 美素数

    题目:     小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。   问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9=11也是素数,所以它是美素数。   给定一个区间,你能计算出这个区间内有多少个美素数吗? Input 第一行输入一个正整数T,表示总共有T组数据(T<=10000)。 接下来共T行,每行输入两个整数L,R(1<=L<=R<=1000000),表示区间的左值和右值。Output对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。 每组数据占一行,具体输出格式参见样例。 SampleInput 3 1100 22 319复制 SampleOutput Case#1:14 Case#2:1 Case#3:4最开始直接for,然后超时了。然后for到sqrt(n)--n的平方。还是超时。为了比较程序修改后运行时间的快慢首先,我们来认识一下#include<math

  • css文字超出div宽度,多余部分显示...

    .txt{ width:100px; height:30px; font-size:20px; line-height:30px; vertical-align:middle; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; }复制  

  • 过滤器与监听器

    Filter 一个Filter程序就是一个Java类,这个类必须实现Filter接口。javax.servlet.Filter接口中定义了三个方法:init、doFilter、destory。 importjavax.servlet.*; importjavax.servlet.annotation.WebFilter; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjava.io.IOException; //控制uri访问权限 @WebFilter(filterName="UrlFilter",urlPatterns={"/admin.jsp"}) publicclassUrlFilterimplementsFilter{ publicvoiddestroy(){ System.out.println("过滤结束。。"); } publicvoiddoFilter(ServletRequestreq,ServletResponse

  • 2017-07-14

    一、代码风格的重要性 今天本来是打算看完一个接口任务的文档的,但是在一个SQL语句和几个实体类栽了很久,主要问题就是有些以前的代码不够规范。和大飞哥交流的过程也了解到项目刚成立的时候规范文档等都没有,所以大家都是按照自己心中认为的规范写,未免有些代码风格乱。 这其实也是一个矛盾点,因为项目一开始确实也不可能定好详细的代码规范,如果什么开始都一开始就完美,那就不存在迭代开发了。ofo其实是个典型的例子,最开始那批自行车的锁特别差,但是如果他们这种小创业者一开始就事事想全了,市场早就被占有了。 这时候就很有必要有良好的代码风格了,何为良好,我想很多书上所谓的代码风格不尽相同,但都有一个特点,就是不会我们不会觉得不好,这就是良好。很感激大学第一和第二门语言课的任课老师李海涛和徐文华老师,都特别强调代码风格,让我一开始就养成习惯。 二、学习委托时,理解了的知识 方法签名由方法的名称和它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。需注意的是,方法签名既不包含返回类型,也不包含params修饰符(它可用于最右边的参数)。在方法重载的上下文中,方法的签名不包括返回值。但

  • BZOJ 2754 【SCOI2012】 喵星球上的点名

    题目链接:喵星球上的点名   首先可以发现姓和名两个串就是逗你玩的。在两个串中间插入一个\(10001\),当成一个串做就可以了。   于是我们的问题转化为了:   有\(n\)个串\(A_1,A_2,\dots,A_n\)和\(m\)个串\(B_1,B_2,\dots,B_m\),要对于每个\(B_i\)求出它被多少个\(A\)串包含,并要对每个\(A_i\)求出它包含了多少个\(B\)串。   我们先把所有串丢到一个\(AC\)自动机里面,然后构出\(fail\)树。我们知道,如果\(S\)串包含了\(A\)串,那么在\(fail\)树上\(A\)串的结尾节点的子树里就会有\(S\)串的节点。所以构出\(dfs\)序之后,要求每个\(B_i\)求出它被多少个\(A\)串包含,就相当于询问区间不同的颜色数。做法同HH的项链。   第二问就是相当于每次给区间内所有元素加\(1\),但是相同的元素只加一次。记位置\(i\)的元素上一次出现的位置为\(pre_i\),那么每次操作\((l,r)\)就相当于给其中满足\(pre_i<l\lei\ler\)的\(i\)位置的元素加\(1\

相关推荐

推荐阅读