1 | bool isPerfectSquare(int num){ |
69.x的平方根
1 | int mySqrt(int x){ |
1 | #include<iostream> |
35. 搜索插入位置
1 | class Solution { |
binary_search &lower_bound &upper_bound
使用方法:
1.binary_search:查找某个元素是否出现
a.函数模板:
binary_search(arr[],arr[]+size,indx)
b.参数说明:
arr[]:数组首地址
size:数组元素个数
indx:需要查找的值
c.函数功能:
在数组中以二分法检索的方式查找,若在数组中查找到indx元素则真,若查找不到则返回值是假
2.lower_bound:查找第一个大于或等于某个元素的位置
a.函数模板:
lower_bound(arr[],arr[]+size,indx)
b.参数说明:
arr[] : 数组首地址
size : 数组元素的个数
indx : 需要查找的值
c.函数功能:
函数lower_bound()在first和last的前闭后开区间进行二分查找,返回大于或等于val的第一个元素的位置,如果所有元素都小于val,则返回last的位置。
举例:
一个数组number序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,111.pos为要插入的位置的下标,则
注意因为返回值是一个指针,所以减去数组的指针就是int变量了
pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number数组的下标为0的位置。
pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number数组的下标为1的位置(即10所在的位置)。
pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素)。
e.注意:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!
返回查找元素的第一个可安插位置,也就是“元素值>=查找值”的第一个元素的位置
3.upper_bound : 查找第一个大于某个元素的位置
a. 函数模板 : upper_bound(arr[] , arr[]+size , indx)
b. 参数说明:
arr[] : 数组首地址
size : 数组元素个数
indx : 需要查找的值
c. 函数功能 :
函数upper_bound()返回的在前闭后开区间查找的关键字的上界,返回大于val的第一个元素位置
例如:一个数组number序列1,2,2,4.upper_bound(2)后,返回的位置是3(下标)也就是4所在的位置,同样,如果插入元素大于数组中全部元素,返回的是last。(注意:数组下标越界)
返回查找元素的最后一个可安插位置,也就是“元素值>查找值”的第一个元素的位置 。
1 | #include<iostream> |
704.二分查找
1 | class Solution { |
1 | int search(int* nums, int numsSize, int target){ |
1 | #include<iostream> |
vector容器
1. vector:
1.1 vector 说明
- vector是向量类型,可以容纳许多类型的数据,因此也被称为容器
- (可以理解为动态数组,是封装好了的类)
- 进行
vector
操作前应添加头文件#include <vector>
1.2 vector初始化:
方式1.
1 | //定义具有10个整型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定 |
方式2.
1 | //定义具有10个整型元素的向量,且给出的每个元素初值为1 |
方式3.
1 | //用向量b给向量a赋值,a的值完全等价于b的值 |
方式4.
1 | //将向量b中从0-2(共三个)的元素赋值给a,a的类型为int型 |
方式5.
1 | //从数组中获得初值 |
1.3 vector对象的常用内置函数使用(举例说明)
1 | #include<vector> |
2. 顺序访问vector的几种方式,举例说明
2.1. 对向量a添加元素的几种方式
1.向向量a中添加元素
1 | vector<int>a; |
2.从数组中选择元素向向量中添加
1 | int a[6]={1,2,3,4,5,6}; |
3.从现有向量中选择元素向向量中添加
1 | int a[6]={1,2,3,4,5,6}; |
4.从文件中读取元素向向量中添加
1 | ifstream in("data.txt"); |
5.常见错误赋值方式
1 | vector<int>a; |
2.2 从向量中读取元素
1.通过下标方式获取
1 | int a[6]={1,2,3,4,5,6}; |
2.通过迭代器方式读取
1 | int a[6]={1,2,3,4,5,6}; |
3.几个常用的算法
1 | #include<algorithm> |
二分查找解题思路以及归错
1.[left,right]
1 | left=0; |
2.[left,right)
1 | left=0; |
题目
模板题704. 二分查找
其他:
Ubuntu安装hive,并配置mysql作为元数据库
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
一、安装hive
1. 下载并解压hive源程序
1 | sudo tar -zxvf ./apache-hive-1.2.1-bin.tar.gz -C /usr/local # 解压到/usr/local中 |
2. 配置环境变量
为了方便使用,我们把hive命令加入到环境变量中去,编辑~/.bashrc文件vim ~/.bashrc
,在最前面一行添加:
1 | export HIVE_HOME=/usr/local/hive |
保存退出后,运行source ~/.bashrc
使配置立即生效。
3. 修改/usr/local/hive/conf下的hive-site.xml
将hive-default.xml.template重命名为hive-default.xml;新建一个文件touch hive-site.xml
,并在hive-site.xml中粘贴如下配置信息:
1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
二、安装并配置mysql
1.Ubuntu下mysql的安装请参考:Ubuntu安装MySQL
2.下载mysql jdbc 包,下载地址
https://downloads.mysql.com/archives/c-j/
1 | tar -zxvf mysql-connector-java-5.1.40.tar.gz #解压 |
3. 启动并登陆mysql shell
1 | service mysql start #启动mysql服务 |
4. 新建hive数据库。
1 | mysql> create database hive; #这个hive数据库与hive-site.xml中localhost:3306/hive的hive对应,用来保存hive元数据 |
5. 配置mysql允许hive接入:
1 | 这条MySQL语句是为用户'hive'授予所有数据库的所有权限,并设置'hive'用户的密码为'hive'。这个命令通常用于在授权给用户访问数据库之前,先为该用户创建一个数据库账户并为其授权。 |
1 | mysql> grant all on *.* to hive@localhost identified by 'hive'; #将所有数据库的所有表的所有权限赋给hive用户,后面的hive是配置hive-site.xml中配置的连接密码 |
6. 启动hive
启动hive之前,请先启动hadoop集群。
1 | start-all.sh #启动hadoop |
解决Hive启动,Hive metastore database is not initialized的错误。出错原因:重新安装Hive和MySQL,导致版本、配置不一致。在终端执行如下命令:
1 | schematool -dbType mysql -initSchema |
Hive 分布现在包含一个用于 Hive Metastore 架构操控的脱机工具,名为 schematool.此工具可用于初始化当前 Hive 版本的 Metastore 架构。此外,其还可处理从较旧版本到新版本的架构升级。
Ubuntu安装MySQL及常用操作
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
一、安装MySQL
使用以下命令即可进行mysql安装,注意安装前先更新一下软件源以获得最新版本:
1 | sudo apt-get update #更新软件源 |
上述命令会安装以下包:
apparmor
mysql-client-5.7
mysql-common
mysql-server
mysql-server-5.7
mysql-server-core-5.7
因此无需再安装mysql-client等。安装过程会提示设置mysql root用户的密码,设置完成后等待自动安装即可。默认安装完成就启动了mysql。
启动和关闭mysql服务器:
1
2service mysql start
service mysql stop
确认是否启动成功,mysql节点处于LISTEN状态表示启动成功:
1
sudo netstat -tap | grep mysql
进入mysql shell界面:
1 | mysql -u root -p |
解决利用sqoop导入MySQL中文乱码的问题(可以插入中文,但不能用sqoop导入中文)
导致导入时中文乱码的原因是character_set_server默认设置是latin1,如下图。
1 | show variables like "char%"; |
可以单个设置修改编码方式set character_set_server=utf8;
但是重启会失效,建议按以下方式修改编码方式。
(1)编辑配置文件。sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
(2)在[mysqld]下添加一行character_set_server=utf8
。如下图
(3)重启MySQL服务。service mysql restart
(4)登陆MySQL,并查看MySQL目前设置的编码。show variables like "char%";
但是我的就直接是这样子的了:
二、MySQL常用操作
注意:MySQL中每个命令后都要以英文分号;结尾。
1、显示数据库
mysql> show databases;
MySql刚安装完有两个数据库:mysql和test。mysql库非常重要,它里面有MySQL的系统信息,我们改密码和新增用户,实际上就是用这个库中的相关表进行操作。
2、显示数据库中的表
mysql> use mysql; (打开库,对每个库进行操作就要打开此库)
Database changed
mysql> show tables;
3、显示数据表的结构:
describe 表名;
4、显示表中的记录:
select * from 表名;
例如:显示mysql库中user表中的纪录。所有能对MySQL用户操作的用户都在此表中。
select * from user;
5、建库:
create database 库名;
例如:创建一个名字位aaa的库
mysql> create database aaa;
6、建表:
use 库名;
create table 表名 (字段设定列表);
例如:在刚创建的aaa库中建立表person,表中有id(序号,自动增长),xm(姓名),xb(性别),csny(出身年月)四个字段
use aaa;
mysql> create table person (id int(3) auto_increment not null primary key, xm varchar(10),xb varchar(2),csny date);
可以用describe命令察看刚建立的表结构。
mysql> describe person;
7、增加记录
例如:增加几条相关纪录。
mysql>insert into person values(null,’张三’,’男’,’1997-01-02’);
mysql>insert into person values(null,’李四’,’女’,’1996-12-02’);
注意,字段的值(’张三’,’男’,’1997-01-02’)是使用两个英文的单撇号包围起来,后面也是如此。
因为在创建表时设置了id自增,因此无需插入id字段,用null代替即可。
可用select命令来验证结果。
mysql> select * from person;
8、修改纪录
例如:将张三的出生年月改为1971-01-10
mysql> update person set csny=’1971-01-10’ where xm=’张三’;
9、删除纪录
例如:删除张三的纪录。
mysql> delete from person where xm=’张三’;
10、删库和删表
drop database 库名;
drop table 表名;
11、查看mysql版本
在mysql5.0中命令如下:
show variables like ‘version’;
或者:select version();
实验4 Spark SQL编程初级实践
1.Spark SQL基本操作
将下列JSON格式数据复制到Linux系统中,并保存命名为employee.json。
为employee.json创建DataFrame,并写出Python语句完成下列操作:
(1) 查询所有数据;
(2) 查询所有数据,并去除重复的数据;
(3) 查询所有数据,打印时去除id字段;
(4) 筛选出age>30的记录;
(5) 将数据按age分组;
(6) 将数据按name升序排列;
(7) 取出前3行数据;
(8) 查询所有记录的name列,并为其取别名为username;
(9) 查询年龄age的平均值;
(10) 查询年龄age的最小值。
1 | 首先为employee.json创建DataFrame,并写出Python语句完成下列操作: |
2.编程实现将RDD转换为DataFrame
源文件内容如下(包含id,name,age):
请将数据复制保存到Linux系统中,命名为employee.txt,实现从RDD转换得到DataFrame,并按“id:1,name:Ella,age:36”的格式打印出DataFrame的所有数据。请写出程序代码。
假设当前目录为/usr/local/spark/mycode/rddtodf,在当前目录下新建一个目录mkdir -p src/main/python,然后在目录/usr/local/spark/mycode/rddtodf/src/main/python下新建一个rddtodf.py,复制下面代码;(下列两种方式任选其一)
方法一:利用反射来推断包含特定类型对象的RDD的schema,适用对已知数据结构的RDD转换;
1 | from pyspark.conf import SparkConf |
方法二:使用编程接口,构造一个schema并将其应用在已知的RDD上。
1 | from pyspark.sql.types import Row |
1 | `python3 ./ rddtodf.py` |
3. 编程实现利用DataFrame读写MySQL的数据
(1)在MySQL数据库中新建数据库sparktest,再创建表employee,包含如表5-2所示的两行数据。
表5-2 employee表原有数据
id | name | gender | Age |
---|---|---|---|
1 | Alice | F | 22 |
2 | John | M | 25 |
1 | mysql> create database sparktest; |
(2)配置Spark通过JDBC连接数据库MySQL,编程实现利用DataFrame插入如表5-3所示的两行数据到MySQL中,最后打印出age的最大值和age的总和。
表5-3 employee表新增数据
id | name | gender | age |
---|---|---|---|
3 | Mary | F | 26 |
4 | Tom | M | 23 |
1 | 答案:假设当前目录为/usr/local/spark/mycode/testmysql,在当前目录下新建一个目录mkdir -p src/main/python,然后在目录/usr/local/spark/mycode/testmysql/src/main/python下新建一个testmysql.py,复制下面代码; |
1 | from pyspark import SparkContext |
然后我们,执行以下指令
1 |
|
在终端下,我们就可以看到结果了。