4.1.2.2.2-Hive-测试
本测试场景来源于TPC –DS,用于数据仓库组件的基准测试,亚马逊公司用其来对Hive和另外一款数据仓库组件Impala进行查询性能的对比测试。本文采用其提供的Jar包生成测试数据,和其提供的表生成和查询语句验证HDFS、Hive和监控组件的可用性。 (1)使用以下命令下载可自动创建测试数据的程序的 JAR:
# wget http://elasticmapreduce.s3.amazonaws.com/samples/impala/dbgen-1.0-jar-with-dependencies.jar
(2)使用以下命令启动程序以创建测试数据。在此示例中,命令行参数指定输出路径 /dbgen,并将 books、customers 和 transactions 表的大小各指定为 1GB。
# java -cp dbgen-1.0-jar-with-dependencies.jar DBGen -p /dbgen -b 1 -c 1 -t 1
(3)查看数据。如图12所示,文件books有书本id、国际标准书号、种类,出版日期、出版社、价格等列,文件customers有顾客id、姓名、出生日期、性别、州、邮箱、号码等列,文件transactions有交易id、顾客id、书本id、交易数量、交易日期等列。
# head books/books
# head customers/customers
# head transactions/transactions
测试数据 (4)使用以下命令,在群集的 HDFS 文件系统中创建新文件夹,并将测试数据从主节点的本地文件系统复制到 HDFS。
hdfs dfs -mkdir /data #在HDFS文件系统下创建目录
hdfs dfs -put /dbgen/* /data #将测试数据从本地文件系统拷贝到HDFS
5.3 查询测试 (1)建表语句 C1:根据文件/data/customers创建表customers, 包含顾客id、姓名、出生日期、性别、州、邮箱、号码等字段,文件的列分隔符为'|'。 CREATE EXTERNAL TABLE books( id BIGINT, isbn STRING, category STRING, publish_date TIMESTAMP, publisher STRING, price FLOAT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' LOCATION '/data/books/';
C2:根据文件/data/books创建表books, 包含书本id、国际标准书号、种类,出版日期、出版社、价格等字段,文件的列分隔符为'|'。 CREATE EXTERNAL TABLE customers( id BIGINT, name STRING, date_of_birth TIMESTAMP, gender STRING, state STRING, email STRING, phone STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' LOCATION '/data/customers/'; C3:根据文件/data/transactions创建表transactions, 包含交易id、顾客id、书本id、交易数量、交易日期等字段,文件的列分隔符为'|'。 CREATE EXTERNAL TABLE transactions( id BIGINT, customer_id BIGINT,
book_id BIGINT, quantity INT, transaction_date TIMESTAMP ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' LOCATION '/data/transactions/'; (2)查询语句 Q1:扫描查询,查询姓名是'Harrison SMITH'的顾客的人数。图13是查询结果,customers表共有341名顾客姓名为 'Harrison SMITH'。 SELECT COUNT(*) FROM customers WHERE name = 'Harrison SMITH';
图13 Q1查询结果 Q2:聚合查询,查询数量最多的10类书。图14是查询结果,数量最多书的种类是BODY-MIND-SPIRIT,共有314102本。 SELECT category, count(*) cnt FROM books GROUP BY category ORDER BY cnt DESC LIMIT 10;
图14 Q2查询结果 Q3:两个表之间的联接查询,此查询将 books 表与 transactions 表联接,以找到特定时间段内具有最大销售额的前 10 种图书类别。图15是查询结果, 销售额最高的书种类是 STUDY-AIDS,销售额是198884109.88元。 SELECT tmp.book_category, ROUND(tmp.revenue, 2) AS revenue FROM ( SELECT books.category AS book_category, SUM(books.price * transactions.quantity) AS revenue FROM books JOIN transactions ON ( transactions.book_id = books.id AND YEAR(transactions.transaction_date) BETWEEN 2008 AND 2010 ) GROUP BY books.category ) tmp ORDER BY revenue DESC LIMIT 10;
图15 Q3查询结果和监控 Q4:三个表之间的联接查询,此查询将 books 表、transactions 表以及customers联接,以找到 'WA'(华盛顿州)、 'CA'(加利福利亚州)和 'NY'(纽约州)的顾客的购买记录中,销售额前10类的图书。图16是查询结果,销售额最高的书目是LAW(法律),销售额为69380769.57元。
SELECT tmp.book_category, ROUND(tmp.revenue, 2) AS revenue FROM ( SELECT books.category AS book_category, SUM(books.price * transactions.quantity) AS revenue FROM books JOIN transactions ON ( transactions.book_id = books.id ) JOIN customers ON ( transactions.customer_id = customers.id AND customers.state IN ('WA', 'CA', 'NY') ) GROUP BY books.category ) tmp ORDER BY revenue DESC LIMIT 10;