本文为您演示如何使用 EMR 上的 Hive 创建库表、导入数据、执行查询等基础操作。
开发准备
确认您已经开通了腾讯云,并且创建了一个 EMR 集群,详情参考创建集群。
在创建 EMR 集群时在软件配置界面选择 Hive 组件。
说明:
登录 EMR 节点的方式可参考登录 Linux 实例。在集群详情页中选择 集群资源 > 资源管理,单击对应节点资源 ID 进入云服务器列表,单击右侧登录,即可使用 WebShell 登录实例。
登录 Linux 实例用户名默认为 root,密码为创建 EMR 时用户自己输入的密码。输入正确后,即可进入命令行界面。
本文操作均是以 hadoop 用户进行,请在登录命令行界面后切换用户身份。
准备样例数据
登录到 Master 节点,在 EMR 命令行使用以下命令切换到 hadoop 用户,并进入 Hive 文件夹:
su hadoopcd /usr/local/service/hive
新建一个 bash 脚本文件 gen_data.sh,在其中添加以下代码:
#!/bin/bashMAXROW=1000000 #指定生成数据行数for((i = 0; i < $MAXROW; i++))doecho $RANDOM, \\"$RANDOM\\"done
并按如下方式赋权并执行脚本,该脚本文件会生成 1000000 个随机数对,并且保存到文件 hive_test.data 中:
chmod +x 脚本名称./gen_data.sh > hive_test.data
使用如下命令把生成的测试数据先上传到 HDFS 中,其中 ${hdfspath} 为 HDFS 上的您存放文件的路径:
hdfs dfs -put ./hive_test.data /${hdfspath}
也可以使用 COS 上面的数据。将数据上传到 COS 中,如果数据在本地,那么可以使用 COS 控制台来上传数据。如果数据在 EMR 集群,那么使用如下命令来上传数据,其中 ${bucketname} 为您创建的 COS 桶名:
hdfs dfs -put ./hive_test.data cosn://${bucketname}/
Hive 基础操作
登录 EMR 集群的 Master 节点,切换 hadoop 用户并通过 Hive 客户端进入 Hive 命令行:
hive
创建库表
使用 SHOW 语法展示当前所有数据库:
hive> show databases;OKdefaultTime taken: 0.26 seconds, Fetched: 1 row(s)
使用 CREATE DATABASE 语法创建一个数据库 test:
hive> create database if not exists test;OKTime taken: 0.176 seconds
使用 USE 语法转到刚刚创建的 test 数据库下:
hive> use test;OKTime taken: 0.176 seconds
使用 CREATE TABLE语法在 test 数据库下创建一个新的名为 hive_test 的内部表:
hive> create table hive_test (a int, b string)hive> ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';-- 创建数据表 hive_test, 并指定列分割符为','OKTime taken: 0.204 seconds
最后可用 SHOW TABLES 语法查看表是否创建成功:
hive> show tables;OKhive_testTime taken: 0.176 seconds, Fetched: 1 row(s)
导入数据
对于存放在 HDFS 中的数据,使用如下指令来将其导入表中:
hive> load data inpath "/${hdfspath}/hive_test.data" into table hive_test;
对于存放在 COS 中的数据,使用如下指令来将其导入表中:
hive> load data inpath "cosn://${bucketname}/hive_test.data" into table hive_test;
也可以将存放在 EMR 集群本地的数据导入到 Hive 中,使用如下指令:
hive>load data local inpath "/${localpath}/hive_test.data" into table hive_test;
说明:
其中 ${hdfspath} 为 HDFS 上的您存放文件的路径,${bucketname} 为您的 COS 桶名, ${localpath} 为您的 EMR 集群本地存放数据的路径。导入完成后,源数据会被删除。
执行查询
查询表中前10个元素:
hive> select * from hive_test limit 10;OK30847 "31583"14887 "32053"19741 "16590"8104 "20321"29030 "32724"27274 "5231"10028 "22594"924 "32569"10603 "27927"4018 "30518"Time taken: 2.133 seconds, Fetched: 10 row(s)
统计表中一共有多少行数据:
hive> select count(*) from hive_test;OK1000000Time taken: 18.504 seconds, Fetched: 1 row(s)
删除库表
使用 DROP TABLE 语法来删除 Hive 表:
hive> drop table if exists hive_test;Moved: 'hdfs://HDFS/usr/hive/warehouse/hive_test' to trash at: hdfs://HDFS/user/hadoop/.Trash/CurrentOKTime taken: 2.327 seconds
使用 DROP DATABASE 语法来删除 Hive 库:
hive> drop database if exists test;OKTime taken: 0.531 seconds