大数据练习六
实验6:熟悉Hive的基本操作
实验环境
操作系统:Ubuntu 18.04
Hadoop版本:3.1.3
Hive版本:3.1.2
JDK版本:1.8.0_212
实验内容与完成情况
- 准备工作
下载并解压数据集:
wget https://www.cocobolo.top/FileServer/prog-hive-1st-ed-data.zip
unzip prog-hive-1st-ed-data.zip
将文件上传到HDFS
hdfs dfs -mkdir -p /hive/input
hdfs dfs -put stocks.csv dividends.csv /hive/input/
2. 实验步骤与执行结果
序号 操作 HiveQL语句 执行结果
2.1 创建内部表stocks sql CREATE TABLE IF NOT EXISTS stocks ( exchange STRING, symbol STRING, ymd STRING, price_open FLOAT, price_high FLOAT, price_low FLOAT, price_close FLOAT, volume INT, price_adj_close FLOAT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE; 成功创建内部表stocks
2.2 创建外部表dividends_unpartitioned sql CREATE EXTERNAL TABLE IF NOT EXISTS dividends_unpartitioned ( ymd STRING, dividend FLOAT, exchange STRING, symbol STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '/hive/external/dividends_unpartitioned'; 成功创建外部表dividends_unpartitioned
2.3 从stocks.csv导入数据到stocks表 sql LOAD DATA INPATH '/hive/input/stocks.csv' INTO TABLE stocks; 成功导入数据,共导入831385行
2.4 从dividends.csv导入数据到dividends_unpartitioned表 sql LOAD DATA INPATH '/hive/input/dividends.csv' INTO TABLE dividends_unpartitioned; 成功导入数据,共导入17314行
2.5 创建外部分区表dividends sql CREATE EXTERNAL TABLE IF NOT EXISTS dividends ( ymd STRING, dividend FLOAT ) PARTITIONED BY (exchange STRING, symbol STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '/hive/external/dividends'; 成功创建分区表dividends
2.6 启用动态分区并向分区表插入数据 sql SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict; INSERT OVERWRITE TABLE dividends PARTITION(exchange, symbol) SELECT ymd, dividend, exchange, symbol FROM dividends_unpartitioned; 成功插入数据,共创建1581个分区
2.7 查询IBM公司2000年起所有支付股息的交易日的收盘价 sql SELECT s.ymd, s.price_close FROM stocks s JOIN dividends d ON s.exchange = d.exchange AND s.symbol = d.symbol AND s.ymd = d.ymd WHERE s.symbol = 'IBM' AND substr(s.ymd, 1, 4) >= '2000' ORDER BY s.ymd; 显示符合条件的记录,共返回60条结果
2.8 查询苹果公司2008年10月每个交易日的涨跌情况 sql SELECT ymd, price_open, price_close, CASE WHEN price_close > price_open THEN 'rise' WHEN price_close < price_open THEN 'fall' ELSE 'unchange' END AS change_status FROM stocks WHERE symbol = 'AAPL' AND substr(ymd, 1, 7) = '2008-10' ORDER BY ymd; 显示2008年10月苹果公司的交易日涨跌情况,共23条记录
2.9 查询收盘价比开盘价高得最多的记录 sql SELECT exchange, symbol, ymd, price_open, price_close, (price_close - price_open) AS price_diff FROM stocks ORDER BY price_diff DESC LIMIT 1; 返回收盘价比开盘价高得最多的记录:
exchange: NYSE, symbol: PCLN, ymd: 2013-02-20, price_diff: 66.24
2.10 查询苹果公司年平均调整后收盘价大于50美元的年份及平均值 sql SELECT substr(ymd, 1, 4) AS year, AVG(price_adj_close) AS avg_price FROM stocks WHERE symbol = 'AAPL' GROUP BY substr(ymd, 1, 4) HAVING avg_price > 50 ORDER BY year; 返回符合条件的年份及平均价格,共8年记录(2010-2017)
出现的问题及解决方案
问题 解决方案
创建表时提示权限不足 确保HDFS目录有写权限,使用hdfs dfs -chmod命令修改权限
导入数据时提示文件不存在 检查HDFS文件路径是否正确,使用hdfs dfs -ls命令确认文件位置
动态分区插入失败 启用动态分区模式:SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict;
查询结果为空 检查表中是否有数据,使用SELECT COUNT(*) FROM table_name;确认数据量
数据导入后显示NULL值 检查文件分隔符是否正确,确保与CREATE TABLE语句中指定的分隔符一致

浙公网安备 33010602011771号