Apache Hive是提供了一种数据映射去读取文本数据,以及提供了类SQL的语句来执行MapReduce。
也就是一种更简化操作的MR。
之前的练习是跟着视频学的hive-1.2.2 而这几天自己练习 hive-2.3.2 才发现很多问题,需要增加一些配置。
以下是笔记:
# Hive是基于Hadoop的一个数据仓库工具,作为数据仓库工具,一般要具备2个方面的能力:一是数据的存储,另一个是ETL。 # Hive以HDFS作为存储,MapReduce作为数据分析。 # 在整个生态圈中,hive是为了简化MapReduce的开发难度。 MR实现复杂查询逻辑开发难度太大。主要用来做离线数据分析。 # 操作接口采用类SQL语法,叫HQL,提供快速开发能力;扩展功能方便。 # Hive 的主要三个特点: # 可扩展 :可自由扩展集群规模,一般不需要重启服务。 # 延展性 :支持用户自定义函数,用户可根据需求实现自己的函数 # 容错 :良好的容错性,节点出问题SQL仍可完成。 #在已经安装配置好JDK以及Hadoop的前提下,安装mysql, 再安装Hive-1.2.2 相对容易配置。 ########################## Hive & derby #不推荐使用此方式 tar zxvf apache-hive-1.2.2-bin.tar.gz mv apache-hive-1.2.2-bin hive-1.2.2 cd hive/bin # 使用derby数据库的最大问题是:不同的路径启动,元数据无法共享。 # hadoop需要先正常启动运行 ./hive # 进入shell show databases; create database abc; use abc; create table t_test(id int); show tables; ############################ 使用 mysql 的方式 生产环境使用。 yum install mysql mysql-server mysql-devel # yum安装mysql及其依赖 cd /var/lib/mysql #这是mysql所在目录 cd /usr/share/mysql/ #相关文件 vim /etc/my.cnf #主要配置文件 # 更详细的安装与配置 https://www.cnblogs.com/chinesern/p/8440206.html /etc/init.d/mysqld start #启动 mysql #mysql控制台 USE mysql; update user set password=PASSWORD('newpassword') where user='root'; grant all PRIVILEGES on *.* to 'root'@'%' IDENTIFIED BY 'newpassword' with grant option; FLUSH PRIVILEGES; --更改root密码,授权远程连接,生效。 service mysqld status # 检查mysqld是否运行 chkconfig mysqld on mysql -u root -p #使用新密码连接 ########## 配置hive vim conf/hive-env.sh export HADOOP_HOME=/usr/local/src/hadoop-2.7.5 vim conf/hive-site.xml <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>111111</value> <description>passowrd to use against metastore database</description> </property> </configuration> # 如果是hive-default.xml复制的,以及高版本的。修改太复杂,就sz到本机来操作。 # 安装mysql连接器驱动 到hive/lib中 https://dev.mysql.com/downloads/connector/ cd hive/lib rz mysql-connector-java-5.1.46.jar # 启动 bin/hive show databases; create database test; describe database test; # 查看库信息 use test; ## 使用库 show tables; # 显示表 show partitions table_name; # 显示表分区信息 show functions; # 显示hive支持的所有方法 desc formatted table_name; # 查看表信息 ### Hive的几种使用方式: # 1. Hive 交互shell bin/hive # 2. Hive JDBC服务(参考java jdbc连接mysql) # 3. hive启动为一个服务器,对外提供服务 会启动一个进程 Runjar bin/hiveserver2 #启动服务后,使用beeline连接。生产环境中最常用的方式。 bin/beeline -u jdbc:hive2://master:10000 -n root # 连接方式,默认端口10000 bin/beeline ! connect jdbc:hive2://master:10000 # 另一种连接方式 # 4. hive命令 # 不常用 hive -e 'sql' bin/hive -e 'show databases' ### 以上4种方法,第3种方法使用时在命令行方式下最美观。 ###################### Hive 数据映射 # Hive本身没有存储功能,所有的数据都存在HDFS中。 # 1. 采用cp文件到数据表文件位置的方法 hdfs dfs -put 1.txt /hivedata hive: show databases; use test; create table t_t1(id int, name string, age int); # http://master:50070 下,会有对应的文件/user/hive/warehouse/test.db/t_t1 hdfs dfs -cp /hivedata/1.txt /user/hive/warehouse/test.db/t_t1 create table t_t2(id int, name string, age int) row format delimited fields terminated by ','; # 带有分隔符创建表 hdfs dfs -cp /hivedata/1.txt /user/hive/warehouse/test.db/t_t2 select * from t_t2; select count(*) from t_t2; # 此句将执行mr程序 http://master:8088 将可以看到进程 # 2. 采用load 文件数据到 数据表的方法 ,不必先上传文件 create table t_t3(id int, name string, age int) row format delimited fields terminated by ' '; # 带有 分隔符创建表 load data local inpath '/test/data2' into table t_t3; # 载入也有同样 分隔符的数据 ######################## 复杂类型的数据表指定分隔符 # 建表的时候一定要根据结构化数据文件的分隔符类型 指定分隔符 # 建表的字段个数和字段类型 要跟结构化数据中的个数类型一致 # 分隔符一般使用内置的来指定 ROW FORMAT DELIMITED 分割字段还是分割集合,等。 #### 示例1.txt 数据: Alex BJ,JS,SH,HZ Jerry SH,CD,WH,HEB # 建表语句: use test; create table complex_array(name string, city array<string>) ROW FORMAT delimited fields terminated by ' ' collection items terminated by ','; # 上传文件 hdfs dfs -put 1.txt /user/hive/warehouse/test.db/complex_array # 查看数据 select * from complex_array; +---------------------+-------------------------+ | complex_array.name | complex_array.city | +---------------------+-------------------------+ | Alex | ["BJ","JS","SH","HZ"] | | Jerry | ["SH","CD","WH","HEB"] | +---------------------+-------------------------+ #### 示例2.txt 数据: 1,Alex,唱歌:非常喜欢-跳舞:喜欢-游戏:一般般 2,Melin,自行车:非常喜欢-足球:不喜欢 # 建表语句 create table t_map(id int,name string,hobby map<string,string>) row format delimited fields terminated by ',' collection items terminated by '-' map keys terminated by ':'; # 上传文件 hdfs dfs -put 2.txt /user/hive/warehouse/test.db/t_map # 查看数据 select * from t_map +-----------+-------------+---------------------------------------------------+ | t_map.id | t_map.name | t_map.hobby | +-----------+-------------+---------------------------------------------------+ | 1 | Alex | {"唱歌":"非常喜欢","跳舞":"喜欢","游戏":"一般般"} | | 2 | Melin | {"自行车":"非常喜欢","足球":"不喜欢"} | +-----------+-------------+---------------------------------------------------+ ############################ 不指定分隔符时的默认分隔符 # 默认分隔符是'