hive数据库操作,hive函数,FineBI可视化操作
1、数据库操作
1.1、创建数据库
create database if not exists myhive;
use myhive;
1.2、查看数据库详细信息
desc database myhive;
数据库本质上就是在HDFS之上的文件夹。
默认数据库的存放路径是HDFS的:/user/hive/warehouse内
1.3、创建数据库并指定hdfs存储位置
使用location关键字,可以指定数据库在HDFS的存储路径。
create database myhive2 location '/myhive2';
1.4、删除数据库
删除一个空数据库,如果数据库下面有数据表,那么就会报错
drop database myhive;
强制删除数据库,包含数据库下面的表一起删除
drop database myhive2 cascade;
2、数据库表操作
2.1、表分类
Hive中可以创建的表有好几种类型, 分别是:
- 内部表
- 外部表
- 分区表
- 分桶表
2.2、内部表
内部表(CREATE TABLE table_name …)
未被external关键字修饰的即是内部表, 即普通表。 内部表又称管理表,内部表数据存储的位置由hive.metastore.warehouse.dir参数决定(默认:/user/hive/warehouse),删除内部表会直接删除元数据(metadata)及存储数据,因此内部表不适合和其他工具共享数据。
2.2.1、创建内部表
内部表的创建语法就是标准的:CREATE TABLE table_name…
- 创建一个基础的表
create database if not exists myhive;use myhive;create table if not exists stu(id int,name string);insert into stu values (1,"zhangsan"), (2, "wangwu");select * from stu;
- 查看表的数据存储
在HDFS上,查看表的数据存储文件
hdfs dfs -ls /user/hive/warehouse/myhive.db/stu
hdfs dfs -cat /user/hive/warehouse/myhive.db/stu/*
2.2.2、数据分隔符
可以看到,数据在HDFS上也是以明文文件存在的。
奇怪的是, 列ID和列NAME,好像没有分隔符,而是挤在一起的。
这是因为,默认的数据分隔符是:”\001”是一种特殊字符,是ASCII值,键盘是打不出来
在某些文本编辑器中是显示为SOH的。
2.2.3、自行指定分隔符
在创建表的时候可以自己决定:
create table if not exists stu2(id int ,name string) row format delimited fields terminated by '\t';
row format delimited fields terminated by ‘\t’:表示以\t分隔
2.2.4、其它创建内部表的形式
除了标准的CREATE TABLE table_name的形式创建内部表外
我们还可以通过:
- CREATE TABLE table_name as,基于查询结果建表
create table stu3 as select * from stu2;
- CREATE TABLE table_name like,基于已存在的表结构建表
create table stu4 like stu2;
- 也可以使用DESC FORMATTED table_name,查看表类型和详情
DESC FORMATTED stu2;
2.2.5、删除内部表
我们是内部表删除后,数据本身也不会保留,让我们试一试吧。
DROP TABLE table_name,删除表
drop table stu2;
可以看到,stu2文件夹已经不存在了,数据被删除了。
2.3、外部表
外部表(CREATE EXTERNAL TABLE table_name …LOCATION…)
被external关键字修饰的即是外部表, 即关联表。
外部表是指表数据可以在任何位置,通过LOCATION关键字指定。 数据存储的不同也代表了这个表在理念是并不是Hive内部管理的,而是可以随意临时链接到外部数据上的。
所以,在删除外部表的时候, 仅仅是删除元数据(表的信息),不会删除数据本身。
内部表和外部表
2.3.1、外部表的创建
外部表,创建表被EXTERNAL关键字修饰,从概念是被认为并非Hive拥有的表,只是临时关联数据去使用。
创建外部表也很简单,基于外部表的特性,可以总结出: 外部表 和 数据 是相互独立的, 即:
- 可以先有表,然后把数据移动到表指定的LOCATION中
- 也可以先有数据,然后创建表通过LOCATION指向数据
- 在Linux上创建新文件,test_external.txt,并填入如下内容:
先创建外部表,然后移动数据
2. 演示先创建外部表,然后移动数据到LOCATION目录
首先检查:hadoop fs -ls /tmp,确认不存在/tmp/test_ext1目录
hadoop fs -ls /tmp
创建外部表:create external table test_ext1(id int, name string) row format delimited fields terminated by ‘\t’ location ‘/tmp/test_ext1’;
create external table test_ext1(id int, name string) row format delimited fields terminated by '\t' location '/tmp/test_ext1';
可以看到,目录/tmp/test_ext1被创建
select * from test_ext1,空结果,无数据
上传数据: hadoop fs -put test_external.txt /tmp/test_ext1/
select * from test_ext1,即可看到数据结果
hadoop fs -put test_external.txt /tmp/test_ext1/
select * from test_ext1
演示先存在数据,后创建外部表
hadoop fs -mkdir /tmp/test_ext2hadoop fs -put test_external.txt /tmp/test_ext2/create external table test_ext2(id int, name string) row format delimited fields terminated by '\t' location '/tmp/test_ext2';select * from test_ext2;
2.3.2、删除外部表
drop table test_ext1;
drop table test_ext2;
可以发现,在Hive中通过show table,表不存在了
但是在HDFS中,数据文件依旧保留
2.3.3、内外部表转换
ive可以很简单的通过SQL语句转换内外部表。
查看表类型:desc formatted stu;
desc formatted stu;
内部表
- 内部表转外部表
alter table stu set tblproperties('EXTERNAL'='TRUE');
- 外部表转内部表
alter table stu set tblproperties('EXTERNAL'='FALSE');
要注意:(‘EXTERNAL’=‘FALSE’) 或 (‘EXTERNAL’=‘TRUE’)为固定写法,区分大小写!!!
2.4、数据加载和导出
2.4.1、数据加载 - LOAD语法
我们使用 LOAD 语法,从外部将数据加载到Hive内,语法如下:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;
- 建表
CREATE TABLE myhive.test_load(dt string comment '时间(时分秒)', user_id string comment '用户ID', word string comment '搜索词',url string comment '用户访问网址'
) comment '搜索引擎日志表' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
- 还没有数据
- 数据加载
从本地加载
load data local inpath '/home/hadoop/search_log.txt' into table myhive.test_load;
- 数据加载从HDFS上传
注意,基于HDFS进行load加载数据,源数据文件会消失(本质是被移动到表所在的目录中)
load data inpath '/tmp/search_log.txt' overwrite into table myhive.test_load;
加上overwrite 关键字。相同的数据不会追加。
2.4.2、数据加载 - INSERT SELECT 语法
除了load加载外部数据外,我们也可以通过SQL语句,从其它表中加载数据。
语法
将SELECT查询语句的结果插入到其它表中,被SELECT查询的表可以是内部表或外部表。
insert into myhive.test_load2 select * from myhive.test_load;
2.4.3、两种语法的选择
-
数据在本地
推荐 load data local加载。 -
数据在HDFS
如果不保留原始文件: 推荐使用LOAD方式直接加载。
如果保留原始文件: 推荐使用外部表先关联数据,然后通过INSERT SELECT 外部表的形式加载数据。 -
数据已经在表中
只可以INSERT SELECT。
2.4.4、hive表数据导出 - insert overwrite 方式
将hive表中的数据导出到其他任意目录,例如linux本地磁盘,例如hdfs,例如mysql等等
语法:insert overwrite [local] directory ‘path’ select_statement1 FROM from_statement;
- 将查询的结果导出到本地 - 使用默认列分隔符
insert overwrite local directory '/home/hadoop/export1' select * from test_load ;
- 将查询的结果导出到本地 - 指定列分隔符
insert overwrite local directory '/home/hadoop/export2' row format delimited fields terminated by '\t' select * from test_load;
- 将查询的结果导出到HDFS上(不带local关键字)
insert overwrite directory '/tmp/export' row format delimited fields terminated by '\t' select * from test_load;
2.4.5、hive表数据导出 - hive shell
基本语法:(hive -f/-e 执行语句或者脚本 > file)
bin/hive -e "select * from myhive.test_load;" > /home/hadoop/export3/export4.txt
bin/hive -f export.sql > /home/hadoop/export4/export4.txt
2.5、分区表
什么是分区表?
- 可以选择字段作为表分区。
- 分区其实就是HDFS上的不同文件夹。
- 分区表可以极大的提高特定场景下Hive的操作性能。
在大数据中,最常用的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个小的文件就会很容易了
同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,按照每天,或者每小时进行切分成一个个的小的文件,这样去操作小的文件就会容易得多了。
同时Hive也支持多个字段作为分区,多分区带有层级关系,如图
2.5.1、分区表的使用
基本语法:
create table tablename(...) partitioned by (分区列 列类型, ......)
row format delimited fields terminated by '';
创建一个分区表
-- 创建一个分区表,按照月分区
create table myhive.score(name string,course string,score int
) partitioned by (month string)
row format delimited fields terminated by '\t';
加载数据到分区
load data local inpath '/home/hadoop/score.txt' into table myhive.score partition(month='202309');
-
9月分区
-
10月分区
2.5.2、查hdfs存储的数据
hdfs dfs -ls /user/hive/warehouse/myhive.db/score
hdfs dfs -cat /user/hive/warehouse/myhive.db/score/month=202309/score.txt
2.5.3、多分区表
根据年月日分区
create table myhive.score2(name string,course string,score int
) partitioned by (year string,month string,day string)row format delimited fields terminated by '\t';-- 加载数据到分区表中
load data local inpath '/home/hadoop/score.txt'into table myhive.score2 partition(year='2023',month='09',day='01');load data local inpath '/home/hadoop/score.txt'into table myhive.score2 partition(year='2023',month='09',day='02');select * from myhive.score2;
2.6、分桶表
分桶和分区一样,也是一种通过改变表的存储模式,从而完成对表优化的一种调优方式。
但和分区不同,分区是将表拆分到不同的子文件夹中进行存储,而分桶是将表拆分到固定数量的不同文件中进行存储。
2.5.1、分桶表创建
- 开启分桶的自动优化(自动匹配reduce task数量和桶数量一致)
set hive.enforce.bucketing=true;
- 创建分桶表
create table course (c_id string,c_name string,t_id string) clustered by(c_id) into 3 buckets row format delimited fields terminated by '\t';
2.5.2、分桶表数据加载
桶表的数据加载,由于桶表的数据加载通过load data无法执行,只能通过insert select.
所以,比较好的方式是
- 创建一个临时表(外部表或内部表均可),通过load data加载数据进入表
-- 创建一个普通表
create table course_temp(c_id string,c_name string,t_id string
) row format delimited fields terminated by '\t';-- 向普通表加载数据
load data local inpath '/home/hadoop/course.txt' into table course_temp;select * from course_temp;
- 然后通过insert select 从临时表向桶表插入数据
-- 临时表向course表加载数据
insert overwrite table course select * from course_temp cluster by(c_id);
2.5.3、为什么不可以用load data,必须用insert select插入数据
如果没有分桶设置,插入(加载)数据只是简单的将数据放入到:
- 表的数据存储文件夹中(没有分区)
- 表指定分区的文件夹中(带有分区)
一旦有了分桶设置,比如分桶数量为3,那么,表内文件或分区内数据文件的数量就限定为3
当数据插入的时候,需要一分为3,进入三个桶文件内。
问题就在于:如何将数据分成三份,划分的规则是什么?
- 数据的三份划分基于分桶列的值进行hash取模来决定
- 由于load data不会触发MapReduce,也就是没有计算过程(无法执行Hash算法),只是简单的移动数据而已,所以无法用于分桶表数据插入。
2.5.4、Hash取模
Hash算法是一种数据加密算法,其主要特征:
-
同样的值被Hash加密后的结果是一致的
比如字符串“hadoop”被Hash后的结果是12345(仅作为示意),那么无论计算多少次,字符串“hadoop”的结果都会是12345。比如字符串“bigdata”被Hash后的结果是56789(仅作为示意),那么无论计算多少次,字符串“bigdata”的结果都会是56789。
基于如上特征,在辅以有3个分桶文件的基础上,将Hash的结果基于3取模(除以3 取余数)
那么,可以得到如下结果:
- 无论什么数据,得到的取模结果均是:0、1、2 其中一个
- 同样的数据得到的结果一致,如hadoop hash取模结果是1,无论计算多少次,字符串hadoop的取模结果都是1。
所以,必须使用insert select的语法,因为会触发MapReduce,进行hash取模计算。
2.5.5、ash取模确定数据归属哪个分桶文件
基于Hash取模,数据中的每一个分桶列的值,都被hash取模得到0、1、2其中一个数
基于结果,存入对应序号的桶文件中。
2.5.6、分桶表的性能提升
如果说分区表的性能提升是:在指定分区列的前提下,减少被操作的数据量,从而提升性能。
分桶表的性能提升就是:基于分桶列的特定操作,如:过滤、JOIN、分组,均可带来性能提升。
2.7、修改表
2.7.1、表重命名
alter table old_table_name rename to new_table_name;如:alter table score4 rename to score5;
2.7.2、修改表属性值
ALTER TABLE table_name SET TBLPROPERTIES table_properties;
table_properties:
: (property_name = property_value, property_name = property_value, … )
如:ALTER TABLE table_name SET TBLPROPERTIES("EXTERNAL"="TRUE"); 修改内外部表属性如:ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment); 修改表注释
2.7.3、添加分区
ALTER TABLE tablename ADD PARTITION (month='201101');
新分区是空的没数据,需要手动添加或上传数据文件
2.7.4、修改分区值
ALTER TABLE tablename PARTITION (month='202005') RENAME TO PARTITION (month='201105');
2.7.5、删除分区
ALTER TABLE tablename DROP PARTITION (month='201105');
2.7.6、添加列
ALTER TABLE table_name ADD COLUMNS (v1 int, v2 string);
2.7.7、修改列名
ALTER TABLE test_change CHANGE v1 v1new INT;
2.7.8、删除表
DROP TABLE tablename;
2.7.9、清空表
TRUNCATE TABLE tablename;
只可以清空内部表
2.8、复杂类型操作
Hive支持的数据类型很多,除了基本的:int、string、varchar、timestamp等
还有一些复杂的数据类型:
- array
数组类型 - map
映射类型 - struct
结构类型
2.8.1、array类型
如下数据文件,有2个列,locations列包含多个城市:
说明:name与locations之间制表符分隔,locations中元素之间逗号分隔
可以使用array数组类型,存储locations的数据
建表语句:
create table myhive.test_array(name string, work_locations array<string>)
row format delimited fields terminated by '\t'
COLLECTION ITEMS TERMINATED BY ',';
- row format delimited fields terminated by ‘\t’ 表示列分隔符是\t
- COLLECTION ITEMS TERMINATED BY ‘,’ 表示集合(array)元素的分隔符是逗号
导入数据
load data local inpath '/home/hadoop/data_for_array_type.txt' overwrite into table myhive.test_array;
常用array类型查询:
-- 查询所有数据
select * from myhive.test_array;
-- 查询loction数组中第一个元素
select name, work_locations[0] location from myhive.test_array;
-- 查询location数组中元素的个数
select name, size(work_locations) location from myhive.test_array;
-- 查询location数组中包含tianjin的信息
select * from myhive.test_array where array_contains(work_locations,'tianjin');
2.8.2、Map类型
map类型其实就是简单的指代:Key-Value型数据格式。 有如下数据文件,其中members字段是key-value型数据
字段与字段分隔符: “,”;需要map字段之间的分隔符:“#”;map内部k-v分隔符:“:”
- 建表语句:
create table myhive.test_map(
id int, name string, members map<string,string>, age int
)
row format delimited
fields terminated by ','
COLLECTION ITEMS TERMINATED BY '#'
MAP KEYS TERMINATED BY ':';
MAP KEYS TERMINATED BY ‘:’ 表示key-value之间用:分隔
- 导入数据
load data local inpath '/home/hadoop/data_for_map_type.txt' overwrite into table myhive.test_map;
- 常用查询
# 查询全部
select * from myhive.test_map;
# 查询father、mother这两个map的key
select id, name, members['father'] father, members['mother'] mother, age from myhive.test_map;
# 查询全部map的key,使用map_keys函数,结果是array类型
select id, name, map_keys(members) as relation from myhive.test_map;
# 查询全部map的value,使用map_values函数,结果是array类型
select id, name, map_values(members) as relation from myhive.test_map;
# 查询map类型的KV对数量
select id,name,size(members) num from myhive.test_map;
# 查询map的key中有brother的数据
select * from myhive.test_map where array_contains(map_keys(members), 'brother');
2.8.3、Struct类型
struct类型是一个复合类型,可以在一个列中存入多个子列,每个子列允许设置类型和名称
有如下数据文件,说明:字段之间#分割,struct之间冒号分割
- 建表语句:
create table myhive.test_struct(
id string, info struct<name:string, age:int>
)
row format delimited
fields terminated by '#'
COLLECTION ITEMS TERMINATED BY ':';
- 导入数据
load data local inpath '/home/hadoop/data_for_struct_type.txt' into table myhive.test_struct;
- 常用查询
select * from myhive.test_struct;
-- 直接使用列名.子列名 即可从struct中取出子列查询
select id, info.name from myhive.test_struct;
2.9、基本查询
2.9.1、基本语法
查询语句的基本语法
SELECT [ALL | DISTINCT]select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BYcol_list]
[HAVING where_condition]
[ORDER BYcol_list]
[CLUSTER BYcol_list| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT number]
整体上和普通SQL差不多,部分有区别,如:CLUSTER BY、DISTRIBUTE BY、SORT BY等
2.9.2、基本查询
- 准备数据:订单表
CREATE DATABASE it;
USE it;
CREATE TABLE it.orders (orderId bigint COMMENT '订单id',orderNo string COMMENT '订单编号',shopId bigint COMMENT '门店id',userId bigint COMMENT '用户id',orderStatus tinyint COMMENT '订单状态 -3:用户拒收 -2:未付款的订单 -1:用户取消 0:待发货 1:配送中 2:用户确认收货',goodsMoney double COMMENT '商品金额',deliverMoney double COMMENT '运费',totalMoney double COMMENT '订单金额(包括运费)',realTotalMoney double COMMENT '实际订单金额(折扣后金额)',payType tinyint COMMENT '支付方式,0:未知;1:支付宝,2:微信;3、现金;4、其他',isPay tinyint COMMENT '是否支付 0:未支付 1:已支付',userName string COMMENT '收件人姓名',userAddress string COMMENT '收件人地址',userPhone string COMMENT '收件人电话',createTime timestamp COMMENT '下单时间',payTime timestamp COMMENT '支付时间',totalPayFee int COMMENT '总支付金额'
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
- 数据加载
LOAD DATA LOCAL INPATH '/home/hadoop/itheima_orders.txt' INTO TABLE it.orders;
- 准备数据:用户表
CREATE TABLE it.users (userId int,loginName string,loginSecret int,loginPwd string,userSex tinyint,userName string,trueName string,brithday date,userPhoto string,userQQ string,userPhone string,userScore int,userTotalScore int,userFrom tinyint,userMoney double,lockMoney double,createTime timestamp,payPwd string,rechargeMoney double
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
- 数据加载
LOAD DATA LOCAL INPATH '/home/hadoop/itheima_users.txt' INTO TABLE it.users;
- 查询所有
SELECT * FROM itheima.orders;
- 查询单列
SELECT orderid, totalmoney, username, useraddress, paytime FROM itheima.orders;
- 查询数据量
SELECT COUNT(*) FROM itheima.orders;
- 过滤广东省订单
SELECT * FROM itheima.orders WHERE useraddress LIKE '%广东%';
- 找出广东省单笔营业额最大的订单
SELECT * FROM itheima.orders WHERE useraddress like '%广东%' ORDER BY totalmoney DESC LIMIT 1;
2.9.3、分组、聚合
- 统计未支付、已支付各自的人数
SELECT ispay, COUNT(*) AS cnt FROM itheima.orders GROUP BY ispay;
- 在已付款订单中,统计每个用户最高的一笔消费金额
SELECT userid, MAX(totalmoney) AS max_money FROM itheima.orders WHERE ispay = 1 GROUP BY userid;
- 统计每个用户的平均订单消费额
SELECT userid, AVG(totalmoney) FROM itheima.orders GROUP BY userid;
- 统计每个用户的平均订单消费额,过滤大于10000的数据
SELECT userid, AVG(totalmoney) AS avg_money FROM itheima.orders GROUP BY userid HAVING avg_money > 10000;
2.9.4、JOIN
- JOIN订单表和用户表,找出用户名
SELECT o.orderid, o.userid, u.username, o.totalmoney, o.useraddress, o.paytime FROM itheima.orders o JOIN itheima.users u ON o.userid = u.userid;
- 左外关联,订单表和用户表,找出用户名
SELECT o.orderid, o.userid, u.username, o.totalmoney, o.useraddress, o.paytime FROM itheima.orders o LEFT JOIN itheima.users u ON o.userid = u.userid;
2.10、RLIKE 正则匹配
正则表达式是一种规则集合,通过特定的规则字符描述,来判断字符串是否符合规则。
RLIKE
Hive中提供RLIKE关键字,可以供用户使用正则和数据进行匹配。
我们以上面中使用的订单表为例,来简单使用一下RLIKE正则匹配。
- 查找广东省的数据
SELECT * FROM itheima.orders WHERE useraddress RLIKE '.*广东.*';
- 查找用户地址是:xx省 xx市 xx区的数据
SELECT * FROM itheima.orders WHERE useraddress RLIKE '..省 ..市 ..区';
- 查找用户姓为张、王、邓
SELECT * FROM itheima.orders WHERE username RLIKE '[张王邓]\\S+';
- 查找手机号符合:188*0 规则
SELECT * FROM itheima.orders WHERE userphone RLIKEE '188\\S{4}0\\S{3}';
2.11、UNION联合
UNION 用于将多个 SELECT 语句的结果组合成单个结果集。
每个 select 语句返回的列的数量和名称必须相同。否则,将引发架构错误。
基础语法:
SELECT ...UNION [ALL]
SELECT ...
准备数据进行测试
- 创建表
CREATE TABLE it.course(
c_id string,
c_name string,
t_id string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
- 加载数据
LOAD DATA LOCAL INPATH '/home/hadoop/course.txt' INTO TABLE it.course;
- 联合两个查询结果集
SELECT * FROM course WHERE t_id = '周杰轮'UNION
SELECT * FROM course WHERE t_id = '王力鸿'
2.11.1、UNION联合 - 去重
UNION默认有去重功能:
- 直接联合两个同样的查询结果
SELECT * FROM course
UNION
SELECT * FROM course
- 如果不需要去重效果
SELECT * FROM courseUNION ALL
SELECT * FROM course
2.11.2、其他写法
- UNION写在FROM中
SELECT t_id, COUNT(*) FROM
(SELECT t_id FROM itheima.course WHERE t_id = '周杰轮'UNION ALLSELECT t_id FROM itheima.course WHERE t_id = '王力鸿'
) AS u GROUP BY t_id;
- 用于INSERT SELECT中
CREATE TABLE it.course2 LIKE it.course;
INSERT OVERWRITE TABLE it.course2SELECT * FROM it.courseUNION ALLSELECT * FROM it.course;
2.12、Sampling采样
2.12.1、为什么需要抽样表数据
对表进行随机抽样是非常有必要的。
大数据体系下,在真正的企业环境中,很容易出现很大的表,比如体积达到TB级别。
对这种表一个简单的SELECT * 都会非常的慢,哪怕LIMIT 10想要看10条数据,也会走MapReduce流程,这个时间等待是不合适的。
Hive提供的快速抽样的语法,可以快速从大表中随机抽取一些数据供用户查看。
2.12.2、TABLESAMPLE函数
进行随机抽样,本质上就是用TABLESAMPLE函数
语法1,基于随机分桶抽样:
SELECT ... FROM tbl TABLESAMPLE(BUCKET x OUT OF y ON(colname | rand()))
- y表示将表数据随机划分成y份(y个桶)
- x表示从y里面随机抽取x份数据作为取样
- colname表示随机的依据基于某个列的值
- rand()表示随机的依据基于整行
示例:
SELECT username, orderId, totalmoney FROM itheima.orders TABLESAMPLE(BUCKET 1 OUT OF 10 ON username);
SELECT * FROM itheima.orders TABLESAMPLE(BUCKET 1 OUT OF 10 ON rand());
注意:
- 使用colname作为随机依据,则其它条件不变下,每次抽样结果一致。
- 使用rand()作为随机依据,每次抽样结果都不同。
语法2,基于数据块抽样
SELECT ... FROM tbl TABLESAMPLE(num ROWS | num PERCENT | num(K|M|G));
- num ROWS 表示抽样num条数据。
- num PERCENT 表示抽样num百分百比例的数据。
- num(K|M|G) 表示抽取num大小的数据,单位可以是K、M、G表示KB、MB、GB。
注意:
- 使用这种语法抽样,条件不变的话,每一次抽样的结果都一致。
- 即无法做到随机,只是按照数据顺序从前向后取。
2.13、Virtual Columns 虚拟列
2.13.1、Virtual Columns虚拟列
虚拟列是Hive内置的可以在查询语句中使用的特殊标记,可以查询数据本身的详细参数。
Hive目前可用3个虚拟列:
- INPUT__FILE__NAME,显示数据行所在的具体文件
- BLOCK__OFFSET__INSIDE__FILE,显示数据行所在文件的偏移量
- ROW__OFFSET__INSIDE__BLOCK,显示数据所在HDFS块的偏移量
- 此虚拟列需要设置:SET hive.exec.rowoffset=true 才可使用
示例:
SELECT *, INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE, ROW__OFFSET__INSIDE__BLOCK FROM it.course;
2.13.2、虚拟列的作用
使用虚拟列,可以让我们更精准的查看到具体每一条数据在存储上的详细参数细节。
虚拟列不仅仅可以用于SELECT,在WHERE、GROUP BY等均可使用。
如:
SELECT *, BLOCK__OFFSET__INSIDE__FILE FROM course WHERE BLOCK__OFFSET__INSIDE__FILE > 50;
SELECT INPUT__FILE__NAME, COUNT(*) FROM it.orders GROUP BY INPUT__FILE__NAME;
除此以外,在某些错误排查场景上,虚拟列可以提供相关帮助。
3、函数
官方文档(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-MathematicalFunctions)
3.1、分类标准
Hive的函数分为两大类:内置函数(Built-in Functions)、用户定义函数UDF(User-Defined Functions):
3.2、查看函数列表
Hive内建了不少函数
使用show functions查看当下可用的所有函数;
通过describe function extended funcname来查看函数的使用方式。
3.3、Mathematical Functions 数学函数
----Mathematical Functions 数学函数-------------
--取整函数: round 返回double类型的整数值部分 (遵循四舍五入)
select round(3.1415926);--指定精度取整函数: round(double a, int d) 返回指定精度d的double类型
select round(3.1415926,4);--取随机数函数: rand 每次执行都不一样 返回一个0到1范围内的随机数
select rand();--指定种子取随机数函数: rand(int seed) 得到一个稳定的随机数序列
select rand(3);--求数字的绝对值
select abs(-3);--得到pi值(小数点后15位精度)
select pi();
3.4、Collection Functions集合函数
3.5、Type Conversion Functions类型转换函数
3.6、Date Functions日期函数
3.7、Conditional Functions条件函数
3.8、String Functions字符串函数
3.9、Data Masking Functions数据脱敏函数
3.10、Misc. Functions其它函数
4、案例
4.1、需求分析
4.1.1、背景介绍:
聊天平台每天都会有大量的用户在线,会出现大量的聊天数据,通过对聊天数据的统计分析,可以更好的对用户构建精准的用户画像,为用户提供更好的服务以及实现高ROI的平台运营推广,给公司的发展决策提供精确的数据支撑。
我们将基于一个社交平台App的用户数据,完成相关指标的统计分析并结合BI工具对指标进行可视化展现。
4.1.2、目标:
基于Hadoop和Hive实现聊天数据统计分析,构建聊天数据分析报表。
4.1.3、需求:
- 统计今日总消息量
- 统计今日每小时消息量、发送和接收用户数
- 统计今日各地区发送消息数据量
- 统计今日发送消息和接收消息的用户数
- 统计今日发送消息最多的Top10用户
- 统计今日接收消息最多的Top10用户
- 统计发送人的手机型号分布情况
- 统计发送人的设备操作系统分布情况
4.1.4、数据内容:
- 数据大小:30万条数据
- 列分隔符:Hive默认分隔符’\001’
- 数据字典及样例数据
4.1.5、建库建表
–如果数据库已存在就删除
drop database if exists db_msg cascade ;
–创建数据库
create database db_msg ;
–切换数据库
use db_msg ;
–列举数据库
show databases ;
--如果表已存在就删除
drop table if exists db_msg.tb_msg_source ;--建表
create table db_msg.tb_msg_source(msg_time string comment "消息发送时间",sender_name string comment "发送人昵称",sender_account string comment "发送人账号",sender_sex string comment "发送人性别",sender_ip string comment "发送人ip地址",sender_os string comment "发送人操作系统",sender_phonetype string comment "发送人手机型号",sender_network string comment "发送人网络类型",sender_gps string comment "发送人的GPS定位",receiver_name string comment "接收人昵称",receiver_ip string comment "接收人IP",receiver_account string comment "接收人账号",receiver_os string comment "接收人操作系统",receiver_phonetype string comment "接收人手机型号",receiver_network string comment "接收人网络类型",receiver_gps string comment "接收人的GPS定位",receiver_sex string comment "接收人性别",msg_type string comment "消息类型",distance string comment "双方距离",message string comment "消息内容"
);
4.1.6、加载数据
-
上传文件到Linux系统
-
load数据到表
load data local inpath '/home/hadoop/chat_data-30W.csv' overwrite into table tb_msg_source;
- 验证结果
select msg_time, sender_name, sender_ip, sender_phonetype, receiver_name, receiver_network
from tb_msg_source limit 10;
4.2、ETL数据清洗
4.2.1、数据清洗
数据问题
- 问题1:当前数据中,有一些数据的字段为空,不是合法数据
select msg_time, sender_name, sender_gps from
db_msg.tb_msg_source where length(sender_gps) = 0 limit 10;
- 问题2:需求中,需要统计每天、每个小时的消息量,但是数据中没有天和小时字段,只有整体时间字段,不好处理
select msg_time from db_msg.tb_msg_source limit 10;
- 问题3:需求中,需要对经度和维度构建地区的可视化地图,但是数据中GPS经纬度为一个字段,不好处理
select sender_gps from db_msg.tb_msg_source limit 10;
4.2.2、需求
- 需求1:对字段为空的不合法数据进行过滤
where过滤 - 需求2:通过时间字段构建天和小时字段
date hour函数 - 需求3:从GPS的经纬度中提取经度和维度
split函数 - 需求4:将ETL以后的结果保存到一张新的Hive表中
create table db_msg.tb_msg_etl(msg_time string comment "消息发送时间",sender_name string comment "发送人昵称",sender_account string comment "发送人账号",sender_sex string comment "发送人性别",sender_ip string comment "发送人ip地址",sender_os string comment "发送人操作系统",sender_phonetype string comment "发送人手机型号",sender_network string comment "发送人网络类型",sender_gps string comment "发送人的GPS定位",receiver_name string comment "接收人昵称",receiver_ip string comment "接收人IP",receiver_account string comment "接收人账号",receiver_os string comment "接收人操作系统",receiver_phonetype string comment "接收人手机型号",receiver_network string comment "接收人网络类型",receiver_gps string comment "接收人的GPS定位",receiver_sex string comment "接收人性别",msg_type string comment "消息类型",distance string comment "双方距离",message string comment "消息内容",msg_day string comment "消息日",msg_hour string comment "消息小时",sender_lng double comment "经度",sender_lat double comment "纬度"
);
4.2.3、ETL数据清洗
- 实现
INSERT OVERWRITE TABLE db_msg.tb_msg_etl
SELECT*,day(msg_time) as msg_day,HOUR(msg_time) as msg_hour,split(sender_gps, ',')[0] AS sender_lng,split(sender_gps, ',')[1] AS sender_lat
FROM tb_msg_source WHERE LENGTH(sender_gps) > 0;
- 查看结果
select msg_time, msy_day, msg_hour, sender_gps, sender_lng, sender_latfrom db_msg.tb_msg_etllimit 10;
4.2.4、扩展概念:ETL
其实我们刚刚完成了 从表tb_msg_source 查询数据进行数据过滤和转换,并将结果写入到:tb_msg_etl表中的操作。
这种操作,本质上是一种简单的ETL行为。
ETL:
- E,Extract,抽取
- T,Transform,转换
- L,Load,加载
从A抽取数据(E),进行数据转换过滤(T),将结果加载到B(L),就是ETL啦。
ETL在大数据系统中是非常常见的。
4.3、指标计算
- 指标1:统计今日消息总量
--保存结果表
CREATE TABLE IF NOT EXISTS tb_rs_total_msg_cnt
COMMENT "每日消息总量" AS
SELECT msg_day, COUNT(*) AS total_msg_cnt
FROM db_msg.tb_msg_etl
GROUP BY msg_day;
- 指标2:统计每小时消息量、发送和接收用户数
--保存结果表
CREATE TABLE IF NOT EXISTS tb_rs_hour_msg_cnt
COMMENT "每小时消息量趋势" AS
SELECT msg_hour, COUNT(*) AS total_msg_cnt, COUNT(DISTINCT sender_account) AS sender_usr_cnt, COUNT(DISTINCT receiver_account) AS receiver_usr_cnt
FROM db_msg.tb_msg_etl GROUP BY msg_hour;
- 指标3:统计今日各地区发送消息总量
CREATE TABLE IF NOT EXISTS tb_rs_loc_cnt
COMMENT '今日各地区发送消息总量' AS
SELECT msg_day, sender_lng, sender_lat, COUNT(*) AS total_msg_cnt
FROM db_msg.tb_msg_etl
GROUP BY msg_day, sender_lng, sender_lat;
- 指标4:统计今日发送和接收用户人数
--保存结果表
CREATE TABLE IF NOT EXISTS tb_rs_usr_cnt
COMMENT "今日发送消息人数、接受消息人数" AS
SELECT
msg_day,
COUNT(DISTINCT sender_account) AS sender_usr_cnt,
COUNT(DISTINCT receiver_account) AS receiver_usr_cnt
FROM db_msg.tb_msg_etl
GROUP BY msg_day;
- 指标5:统计发送消息条数最多的Top10用户
--保存结果表
CREATE TABLE IF NOT EXISTS db_msg.tb_rs_s_user_top10
COMMENT "发送消息条数最多的Top10用户" AS
SELECT sender_name AS username, COUNT(*) AS sender_msg_cnt
FROM db_msg.tb_msg_etl
GROUP BY sender_name
ORDER BY sender_msg_cnt DESC
LIMIT 10;
- 指标6:统计接收消息条数最多的Top10用户
CREATE TABLE IF NOT EXISTS db_msg.tb_rs_r_user_top10
COMMENT "接收消息条数最多的Top10用户" AS
SELECT
receiver_name AS username,
COUNT(*) AS receiver_msg_cnt
FROM db_msg.tb_msg_etl
GROUP BY receiver_name
ORDER BY receiver_msg_cnt DESC
LIMIT 10;
- 指标7:统计发送人的手机型号分布情况
CREATE TABLE IF NOT EXISTS db_msg.tb_rs_sender_phone
COMMENT "发送人的手机型号分布" AS
SELECT sender_phonetype, COUNT(sender_account) AS cnt
FROM db_msg.tb_msg_etl
GROUP BY sender_phonetype;
- 指标8:统计发送人的手机操作系统分布
--保存结果表
CREATE TABLE IF NOT EXISTS db_msg.tb_rs_sender_os
COMMENT "发送人的OS分布" AS
SELECTsender_os, COUNT(sender_account) AS cnt
FROM db_msg.tb_msg_etl
GROUP BY sender_os;
4.4、fineBI安装与配置
4.4.1、BI概述
BI:Business Intelligence,商业智能。
指用现代数据仓库技术、线上分析处理技术、数据挖掘和数据展现技术进行数据分析以实现商业价值。
简单来说,就是借助BI工具,可以完成复杂的数据分析、数据统计等需求,为公司决策带来巨大的价值。
所以,一般提到BI,我们指代的就是工具软件。常见的BI软件很多,比如:
- FineBI
- SuperSet
- PowerBI
- TableAu
4.4.2、FineBI的介绍
FineBI的介绍:https://www.finebi.com/
FineBI 是帆软软件有限公司推出的一款商业智能(Business Intelligence)产品。FineBI 是定位于自助大数据分析的 BI 工具,能够帮助企业的业务人员和数据分析师,开展以问题导向的探索式分析。
FineBI的特点
- 通过多人协作来实现最终的可视化构建
- 不需要通过复杂代码来实现开发,通过可视化操作实现开发
- 适合于各种数据可视化的应用场景
- 支持各种常见的分析图表和各种数据源
- 支持处理大数据
4.4.3、FineBI的安装
-
下载:https://www.finebi.com/
-
注册拿到激活码
-
安装软件,运行激活
-
运行后会打开一个网页,设置用户名密码
-
自己使用,选择内置数据库即可
-
fineBI首页
4.4.4、fineBI配置hive数据库
-
fineBI引入hive驱动
-
安装隔离插件
4.4.5、连接数据库
4.5、FineBI可视化展现
4.5.1、同步数据
4.5.2、显示–今日发送消息人数、接受消息人数
-
添加仪表板
-
去掉标题
-
切换样式
-
接受消息人数
4.5.3、发送用户总数
4.5.4、发送消息最多的top10(折线雷达图)
4.5.5、发送用户操作系统占比(饼图)
4.5.6、各地区人数分布(地图)
4.5.7、接受消息最多的top10(柱状图)
4.5.8、发送人的手机型号分布(文本)![在这里插入图片描述](https://img-blog.csdnimg.cn/a4ec23e146294f52a4e7caaaa2b4c85f.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/06897b0429374393b94b1d3a9ef95011.png)
4.5.8、每小时消息趋势(多区折线图)
结束!!
hy:43
一个胜利者不会放弃,而一个放弃者永远不会胜利。
相关文章:
![](https://img-blog.csdnimg.cn/1e7677799aed4d2eb72502cbe573b914.png)
hive数据库操作,hive函数,FineBI可视化操作
1、数据库操作 1.1、创建数据库 create database if not exists myhive;use myhive;1.2、查看数据库详细信息 desc database myhive;数据库本质上就是在HDFS之上的文件夹。 默认数据库的存放路径是HDFS的:/user/hive/warehouse内 1.3、创建数据库并指定hdfs存…...
![](https://www.ngui.cc/images/no-images.jpg)
信息学奥赛一本通 2075:【21CSPJ普及组】插入排序(sort) | 洛谷 P7910 [CSP-J 2021] 插入排序
【题目链接】 ybt 2075:【21CSPJ普及组】插入排序(sort) 洛谷 P7910 [CSP-J 2021] 插入排序 【题目考点】 1. 排序: 插入排序 插入排序示例: #include <bits/stdc.h> using namespace std; int main() {int…...
![](https://img-blog.csdnimg.cn/img_convert/5b51d24960a4533a68f4ed38059b1ca1.png)
基于微信小程序的民宿短租酒店预订系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...
![](https://img-blog.csdnimg.cn/ab24ac3c246e451c9f7dcf8c07c2b346.png)
Python第二次作业(2)【控制台界面】
要求:使用Python输出五个控制台界面 第一张: 代码如下: print(" 英雄联盟商城登录界面 ") print("~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*") print(" 1.用户登录 &q…...
![](https://www.ngui.cc/images/no-images.jpg)
conda创建环境在Collecting package metadata (current_repodata.json)时报错的解决
conda创建环境在Collecting package metadata (current_repodata.json)时报错的解决 报错信息: Collecting package metadata (current_repodata.json): - ERROR conda.auxlib.logz:stringify(171): Traceback (most recent call last): File “C:\Users\dandelion…...
![](https://img-blog.csdnimg.cn/img_convert/ab9ed750c59bbd75342d29577682cafe.png)
卤制品配送经营商城小程序的用处是什么
卤制品也是食品领域重要的分支,尤其对年轻人来说,只要干净卫生好吃价格合理,那复购率宣传性自是不用说,而随着互联网发展,传统线下门店也须要通过线上破解难题或进一步扩大生意。 而商城小程序无疑是商家通过线上私域…...
![](https://www.ngui.cc/images/no-images.jpg)
信息化发展65
1.2现代化基础设施 基础设施包括交通、能源、水利、物流等以传统基础设施和信息网络为核心的新型基础设施,在国家发展全局中具有战略性、基础性、先导性作用。统筹推进传统基础设施和新型基础设施建设,打造系统完备、高效实用、智能绿色、安全可靠的现代…...
![](https://img-blog.csdnimg.cn/3645bdfbd1d94e67ab9a35fde9b85dc4.png)
pytho实例--pandas读取表格内容
前言:由于运维反馈帮忙计算云主机的费用,特编写此脚本进行运算 如图,有如下excel数据 计算过程中需用到数据库中的数据,故封装了一个读取数据库的类 import MySQLdb from sshtunnel import SSHTunnelForwarderclass SSHMySQL(ob…...
![](https://www.ngui.cc/images/no-images.jpg)
处理飞书在线文档导出Word后无法自动编号问题
处理飞书在线文档导出Word后无法自动编号问题 解题思路:处理效果处理代码测试数据 最近工作中经常编写一些文档,有些文档需要多人协作完成。这两天需要完成一个可研的初稿,同事使用了飞书的在线文档。第一次使用飞书进行文档协作,…...
![](https://img-blog.csdnimg.cn/f798ba8d6ae4433083d637821d398245.png)
C++刷题 全排列问题
C刷题 全排列问题 题目描述思路讲解代码展示 题目描述 思路讲解 代码展示 #include <iostream>using namespace std;const int maxn 11;//P为当前排列,hashTable记录整数x是否已经在P中 int n, P[maxn], hashTable[maxn] {false};//当前处理排列的第index号…...
![](https://www.ngui.cc/images/no-images.jpg)
求数列a+aa+aaa+aaaa+......前n项和,a和n均由输入获得。
求数列aaaaaaaaaa…前n项和,a和n均由输入获得。 输入格式: 输入两个正整数a和n,两个数之间用逗号分隔。 输出格式: 输出"aaaaaaaaaa…和"的形式,详见输出样例。 输入样例: 在这里给出一组输入。例如: 3,6 输出样例:…...
![](https://img-blog.csdnimg.cn/ff9b94dbb28046e1a15cd765414ebd03.gif)
ElementUI之首页导航+左侧菜单->mockjs,总线
mockjs总线 1.mockjs 什么是Mock.js 前后端分离开发开发过程当中,经常会遇到以下几个尴尬的场景: - 老大,接口文档还没输出,我的好多活干不下去啊! - 后端小哥,接口写好了没,我要测试啊&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
文心大模型写TodoList项目需求
大模型写TodoList项目需求 提示词 你是一名资深的互联网软件行业产品经理。 现在要设计一个todo-list项目,它有哪些功能和需求? 分条目写出需求大纲。 文心大模型输出 设计一个Todo-list项目时,需要考虑以下功能和需求: 基本功能: 创建任…...
![](https://www.ngui.cc/images/no-images.jpg)
使用applescript自动化trilium的数学公式环境(二)
9.23 ver1 没想到今天很有精神,在玩chatgpt的时候突然想到,为什么不让他帮我写一份代码呢?说干就干。但是,可能是因为我的英语不怎么样,chatgpt生成出来的整个东西实在是菜的抠脚。所以我觉得还是应该自己先想好一个大…...
![](https://img-blog.csdnimg.cn/fb95a0ec796a4129a69622ae884e26b7.png)
机器学习与数据挖掘第三、四周
为什么第二周没有呢……因为刚换老师,自学要适应一段时间。 本课程作者之后的学习目标是:实操代码,至少要将作者参加数学建模中用到的数据处理方法都做一遍。 首先,作者复习一下李宏毅老师的两节课程。 机器学习概述 机器学习就…...
![](https://img-blog.csdnimg.cn/img_convert/d03c550202dbc34295ff5ec314fd6bf3.jpeg)
黎明加水印微信小程序源码 支持流量主接入
黎明加水印微信小程序源码,支持流量主接入。支持从聊天记录选择文件、相机拍摄、直接选择文件 支持白底、黑底的隐形水印,制作后,通过增加蒙版方能看到水印 纯前端,可嵌入任何项目。 部署教程 1、解压后得到项目文件夹 3、把…...
![](https://www.ngui.cc/images/no-images.jpg)
22 Python的argparse模块
概述 在上一节,我们介绍了Python的datetime模块,包括:datetime模块中一些常用的属性和函数。在这一节,我们将介绍Python的argparse模块。argparse模块是Python的一个标准库,用于编写命令行界面。它可以处理命令行参数和…...
![](https://img-blog.csdnimg.cn/d1f069b55cd44b93bf4710a5b711c7cc.png)
Unity之NetCode多人网络游戏联机对战教程(3)--NetworkObject组件讲解
文章目录 NetworkObjectAlways Replicate As RootSynchronization TransformActive Scene SynchronizationScene Migration SynchronizationSpawn With ObserversDont Destroy With OwnerAuto Object Parent Sync 后话 NetworkObject 为了复制任何Netcode感知属性或发送/接收R…...
![](https://www.ngui.cc/images/no-images.jpg)
正点原子lwIP学习笔记——Socket接口UDP实验
1. Socket接口UDP连接配置 Socket接口的UDP配置流程如下: sin_family 设置为 AF_INET 表示 IPv4 网络协议;sin_port 为设置端口号, 可设置为 8080;sin_addr.s_addr 设置本地 IP 地址;调用函数 Socket 创建 Socket 连…...
![](https://img-blog.csdnimg.cn/img_convert/eece83b92104258f1bacad0f76fa96ed.png)
连接组学中的机器学习:从表征学习到模型拟合
前言 机器学习(ML)由于其高自动化程度、高灵敏度和特异性优势,在医学影像领域取得了巨大的成功。由于具备这些优势,机器学习已被广泛应用于神经成像数据,目的是提取与感兴趣变量(如疾病状态)相关的特征。这使我们能够形成关于不同条件下大脑…...
![](https://img-blog.csdnimg.cn/b7fb60c22ac34aae88259814969f7b5c.png)
数据结构-----二叉树的创建和遍历
目录 前言 二叉树的链式存储结构 二叉树的遍历 1.前序遍历 2.中序遍历 3.后序遍历 二叉树的创建 创建一个新节点的函数接口 1.创建二叉树返回根节点 2.已有根节点,创建二叉树 3.已有数据,创建二叉树 前言 在此之前我们学习了二叉树的定义和储…...
![](https://www.ngui.cc/images/no-images.jpg)
【算法题】1333. 餐厅过滤器
题目: 给你一个餐馆信息数组 restaurants,其中 restaurants[i] [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息。 其中素食者友好过滤器 veganFriendly 的值可以为 true 或者 false,如果…...
![](https://www.ngui.cc/images/no-images.jpg)
linux脚本笔记
目录 1.增加环境变量 2.自定义命令快捷键 3.关闭selinux和防火墙 4.增加别名快捷键 5.Linux链接 1.增加环境变量 新建add_env.sh #!/bin/bashapp_dir"/root/docker"# 检查配置文件中是否已存在相同的环境变量 if grep -q -E "^export APP_HOME.*" ~…...
![](https://www.ngui.cc/images/no-images.jpg)
目标检测YOLO实战应用案例100讲-面向路边停车场景的目标检测(中)
目录 3.1.1 特征图相似度计算 3.1.2 特征图相似度实验 3.1.3 基于GhostBlock的网络结构改进...
![](https://img-blog.csdnimg.cn/img_convert/0d307fd4adbc77ebb663456f611696e1.png)
[论文笔记]Prefix Tuning
引言 今天带来微调LLM的第二篇论文笔记Prefix-Tuning。 作者提出了用于自然语言生成任务的prefix-tuning(前缀微调)的方法,固定语言模型的参数而优化一些连续的任务相关的向量,称为prefix。受到了语言模型提示词的启发,允许后续的token序列注意到这些prefix,当成虚拟toke…...
![](https://img-blog.csdnimg.cn/eaaa4789a17c40e09e247d1fc8a31adf.png)
electron快速入门
新建electronstu01文件夹 以管理员身份运行powershell,切换到该文件下 npm init -y安装依赖包 npm install --save-dev electron失败 npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm install --save-dev electron修改 package.json &qu…...
![](https://img-blog.csdnimg.cn/2af7dcc9af4e4fc8a646c2d2617022a6.png)
C语言的stdio.h的介绍
C语言的stdio.h的介绍 C语言的stdio.h的介绍 C语言的stdio.h的介绍C语言stdio.h的介绍 C语言stdio.h的介绍 这个含义是导入标准输入输出库 包含头文件.h,std标准库,io是input output输入输出库 <>代表系统库,自定义的话用""…...
![](https://img-blog.csdnimg.cn/afdcd2eec0c24644902aebde06770667.png)
使用香橙派 在Linux环境中安装并学习Python
前言 在实际项目中,经常会遇到需要使用人工智能的场景,如人脸识别,车牌识别等...其一般的流程就是由单片机采集数据发送给提供人工智能算法模型的公司(百度云,阿里云...),然后人工智能将结果回…...
![](https://img-blog.csdnimg.cn/img_convert/2e0395b480c1c7e662b925f95caae348.jpeg)
如何开发物联网 APP?
如何开发物联网 APP? 这个问题本身是不严谨的,APP只是手机端的一个控制或者用于显示的人机交互页面,物联网是通过传感器,物联网卡等模块把物体接入网络以方便远程监控或者控制等。 你问的应该是怎么开发出来一个远程控制物体的APP吧&#x…...
![](https://img-blog.csdnimg.cn/4f2e1a41ff4d4f589ba32b4f1794a06c.png)
配置pytorchGPU虚拟环境-python3.7
cuda版本的pytorch包下载地址戳这里 winR->输入cmd->输nvcc -V回车 cuda 11.0 输入以下命令来查找 CUDA 的安装路径: Windows: where nvcc 输入以下命令来查找 cuDNN 的版本号: Windows: where cudnn* cuDNN 8.0 本机安装的是cuda 11.0&…...
![](https://img-blog.csdnimg.cn/img_convert/726505ddf1939c417c58f01c2e8c54a5.png)
东莞清洁服务网站建设/关键词优化的作用
首先,关注破千了,感谢大家的支持。D2-Net A Trainable CNN for Joint Description and Detection of Local Featureshttps://arxiv.org/pdf/1905.03561.pdfarxiv.org一、论文出发点传统的关键点检测,例如SI…...
![](/images/no-images.jpg)
哈尔滨一恒建设/济南网站seo优化
介绍 Go 的 slice 类型提供了一种方便有效的方法来处理类型化数据序列。切片类似于其他语言中的数组,但具有一些不寻常的属性。本文将介绍切片是什么以及它们的使用方法。 数组 切片类型是建立在 Go 的数组类型之上的抽象,因此要理解切片我们必须首先理解数组。 数组类型定义…...
![](https://img-blog.csdnimg.cn/c35c120217fe41de99a91e659464554e.png)
wordpress修改成中文/网站制作公司咨询
大家好,我是脚丫先生 (o^^o) 说起,android,这是多么遥远的英文单词。 「第一行代码」 我想学过android开发的小伙伴都应该读过,可谓是入门神作。 看着郭霖大佬的大作,此刻,有那么带点陌生而又带一丝熟悉…...
![](https://img-blog.csdnimg.cn/20201010093859759.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FXZW5fSmFjaw==,size_16,color_FFFFFF,t_70#pic_center)
wordpress 初始化/seo顾问合同
原因: Springboot版本为2.1.3.RELEASE, Netty版本为4.1.50.Final, 引入spring-boot-starter-data-redis依赖后, 因为其中也有Netty依赖, 但是版本只有4.1.33, 因而版本冲突导致异常 解决方法: 1. 将Springboot版本改为2.2.6.RELEASE 2. 或将Netty版本改为4.1.33.Final<pa…...
![](https://img-blog.csdnimg.cn/20210223104543569.jpg#pic_center)
怎么用ai做企业网站框架/网络推广用什么软件好
合金体系的势函数除了eam势,还有meam势。在新版本的lammps中,meam势类型已经改为meam/c,本文主要介绍meam/c势的设置方法。 和普通的势函数文件不同,meam/c势有两个势函数文件:library.meam和**.meam,**表示…...
![](/images/no-images.jpg)
动易网站建设/有哪些网络推广平台
概述:点语法的作用,property synthesize 如何使用,编译器如何对其进行展开,property的其它属性1)点语法的作用:个人觉得点语法的引入就是为了方便不写[],以下面代码为切入点,介绍int…...