有奖捉虫:云通信与企业服务文档专题,速来> HOT
本文为您演示如何使用 EMR 上的 Hive 创建库表、导入数据、执行查询等基础操作。

开发准备

确认您已经开通了腾讯云,并且创建了一个 EMR 集群,详情参考创建集群
在创建 EMR 集群时在软件配置界面选择 Hive 组件。
示例中存在需要访问腾讯云对象存储 COS 的可选内容,可参考 创建存储桶 在 COS 中创建一个存储桶(Bucket),并于 EMR 控制台 实例信息 页面开启对象存储授权。
说明:
登录 EMR 节点的方式可参考登录 Linux 实例。在集群详情页中选择 集群资源 > 资源管理,单击对应节点资源 ID 进入云服务器列表,单击右侧登录,即可使用 WebShell 登录实例。
登录 Linux 实例用户名默认为 root,密码为创建 EMR 时用户自己输入的密码。输入正确后,即可进入命令行界面。
本文操作均是以 hadoop 用户进行,请在登录命令行界面后切换用户身份。

准备样例数据

登录到 Master 节点,在 EMR 命令行使用以下命令切换到 hadoop 用户,并进入 Hive 文件夹:
su hadoop
cd /usr/local/service/hive
新建一个 bash 脚本文件 gen_data.sh,在其中添加以下代码:
#!/bin/bash
MAXROW=1000000 #指定生成数据行数
for((i = 0; i < $MAXROW; i++))
do
echo $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;
OK
default
Time taken: 0.26 seconds, Fetched: 1 row(s)
使用 CREATE DATABASE 语法创建一个数据库 test:
hive> create database if not exists test;
OK
Time taken: 0.176 seconds
使用 USE 语法转到刚刚创建的 test 数据库下:
hive> use test;
OK
Time 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, 并指定列分割符为','
OK
Time taken: 0.204 seconds
最后可用 SHOW TABLES 语法查看表是否创建成功:
hive> show tables;
OK
hive_test
Time 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;
OK
30847 "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;
OK
1000000
Time 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/Current
OK
Time taken: 2.327 seconds
使用 DROP DATABASE 语法来删除 Hive 库:
hive> drop database if exists test;
OK
Time taken: 0.531 seconds