hive timestamp转化为string_《Hive用户指南》- HiveSQL转化为MapReduce任务

Hive是Facebook实现的一个开源的数据仓库工具——

  • Hive基于Hadoop实现,底层数据存放在HDFS中,计算(查询)使用MapReduce任务实现
  • 将结构化的数据文件映射为数据库表,并提供HQL查询功能,将HQL语句转化为MapReduce任务运行

关于Hive的介绍,可以参考我之前的笔记。

Hive简介、基本架构与存储结构_大数据_机器学习,大数据-优快云博客​blog.youkuaiyun.com
c7b9879d352c5abc107b4178eed633e9.png

在实际应用中,我们主要通过编写HiveSQL来对数据进行查询等操作,本文介绍常用的HiveSQL如何转化为MapReduce任务,便于在编写SQL时写出更加高效的代码。

1. hive.fetch.task.conversion参数

在Hive中,有些简单任务既可以转化为MR任务,也可以Fetch抓取,即直接读取table对应的存储目录下的文件得到结果,具体的行为取决于Hive的hive.fetch.task.conversion参数。

hive-default.xml.template中,可以找到这个参数描述如下:

<property>
    <name>hive.fetch.task.conversion</name>
    <value>more</value>
    <description>
      Expects one of [none, minimal, more].
      Some select queries can be converted to single FETCH task minimizing latency.
      Currently the query should be single sourced not having any subquery and should not have any aggregations or distincts (which incurs RS), lateral views and joins.
      0. none : disable hive.fetch.task.conversion
      1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
      2. more    : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual columns)
    </description>
</property>
  • 当设置为none时,所有任务转化为MR任务;
  • 当设置为minimal时,全局查找SELECT *、在分区列上的FILTER(where...)、LIMIT才使用Fetch,其他为MR任务;
  • 当设置为more时,不限定列,简单的查找SELECTFILTERLIMIT都使用Fetch,其他为MR任务。

默认情况下,使用参数more,本文也介绍参数为more时的SQL转化。

这里把SQL在命令行中运行验证,可以看到该SQL中SELECT指定列、包含WHERE、LIMIT子句,但没有转化为MR任务(若有会有相应的MapReduce提示,如后面的图中所示),说明为直接Fetch抓取结果。

bb07d5be220c5892b76034df247dfc6e.png

2. 转化为MR任务的SQL

需要转化为MR任务的SQL通常会涉及到key的shuffle,比如JOINGROUP BYDISTINCT等,此处介绍这三种任务的转化,示例使用的两个表如下:

page_view——

46e186fec2065eafd6d848d964fc6640.png

userinfo——

eb926acf479a09ca55e498d676c7d77b.png

2.1 JOIN

JOIN任务转化为MR任务的流程如下:

  • Map:生成键值对,以JOIN ON条件中的列作为Key,以JOIN之后所关心的列作为Value,在Value中还会包含表的 Tag 信息,用于标明此Value对应于哪个表
  • Shuffle:根据Key的值进行 Hash,按照Hash值将键值对发送至不同的Reducer中
  • Reduce:Reducer通过 Tag 来识别不同的表中的数据,根据Key值进行Join操作

编写SQL如下:

SELECT pageid, age 
FROM page_view JOIN userinfo ON page_view.userid = userinfo.userid; 

则转化后的MR任务流程如下图所示,其中键值对中value的第一个值为表的tag,表明数据属于那个表

924b5751d8d9abd0c871f6d6e940aa1f.png

在Hive命令行工具中运行上述代码,结果如下,注意到reducer为0,原因是示例的表很小,Hive默认将其优化为mapjoin任务,关于mapjoin任务原理可以参考。

Hive调优策略--Fetch抓取 & 表的各种优化策略(mapjoin原理)​blog.youkuaiyun.com
379a74288318f451639b0f60bb2afeea.png

当表都较大时,则会按照上图所示流程进行MR任务。

3b79eb9ba7947839912158ebaa951beb.png

2.2 GROUP BY

JOIN任务转化为MR任务的流程如下:

  • Map:生成键值对,以GROUP BY条件中的列作为Key,以聚集函数的结果作为Value
  • Shuffle:根据Key的值进行 Hash,按照Hash值将键值对发送至不同的Reducer中
  • Reduce:根据SELECT子句的列以及聚集函数进行Reduce

编写SQL如下:

SELECT pageid, COUNT(1) as num
FROM page_view
GROUP BY pageid;

则转化后的MR任务流程如下图所示:

3e1ce01b8839393da6f9100052f6a268.png

在Hive命令行工具中运行上述代码,结果如下,与上述过程一致。

7464a1e8b71aec14f9bc11240b974a5c.png

2.3 DISTINCT

相当于没有聚集函数的GROUP BY,操作相同,只是键值对中的value可为空。

SELECT DISTINCT pageid FROM page_view;

在Hive命令行工具中运行上述代码结果如下:

572656b48c55cf122651209e1e68e41c.png

Reference

  1. 《Hive用户指南》
Hive简介、基本架构与存储结构_大数据_机器学习,大数据-优快云博客​blog.youkuaiyun.com
c7b9879d352c5abc107b4178eed633e9.png
Hive调优策略--Fetch抓取 & 表的各种优化策略(mapjoin原理)​blog.youkuaiyun.com
379a74288318f451639b0f60bb2afeea.png
细说Hive SQL触发MR的场景​blog.youkuaiyun.com
be237c8068e58d43f5dcf69103c353ca.png
ls -l /home/hadoop/Processed_UserBehavior.csv (2) 创建MySQL数据库和表 sql -- 登录MySQL mysql -u root -p -- 创建数据库 CREATE DATABASE taobao_analysis; USE taobao_analysis; -- 创建表结构 CREATE TABLE user_behavior ( user_id INT, item_id INT, category_id INT, behavior_type VARCHAR(10), timestamp BIGINT ); (3) 导入CSV数据到MySQL sql -- 启用本地文件加载 SET GLOBAL local_infile = 1; -- 执行导入(注意使用绝对路径) LOAD DATA LOCAL INFILE '/home/hadoop/Processed_UserBehavior.csv' INTO TABLE user_behavior FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES; -- 如果CSV有标题行 (4) 验证数据 sql SELECT COUNT(*) FROM user_behavior; -- 检查总行数 SELECT * FROM user_behavior LIMIT 5; -- 查看样例数据 2. 数据导入HBase (1) 启动HBase服务 如果尚未启动: bash start-hbase.sh hbase shell (2) 创建HBase表 bash create 'taobao_behavior', 'cf' (3) 使用Sqoop导入MySQL数据到HBase bash sqoop import \ --connect jdbc:mysql://localhost/taobao_analysis \ --username root \ --password yourpassword \ --table user_behavior \ --hbase-table taobao_behavior \ --column-family cf \ --hbase-row-key user_id \ --split-by user_id \ -m 1 # 伪分布式环境下减少并行任务数 (4) 验证HBase数据 bash hbase shell scan 'taobao_behavior', {LIMIT => 5} 3. 使用Hive分析数据 (1) 启动Hive Metastore服务 bash hive --service metastore & (2) 创建Hive外部表映射HBase数据 sql CREATE EXTERNAL TABLE hive_taobao_behavior ( key INT, user_id INT, item_id INT, category_id INT, behavior_type STRING, timestamp BIGINT ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.columns.mapping" = " :key, cf:user_id, cf:item_id, cf:category_id, cf:behavior_type, cf:timestamp" ) TBLPROPERTIES ("hbase.table.name" = "taobao_behavior"); (3) 执行分析查询 用户行为统计 sql SELECT behavior_type, COUNT(*) as count FROM hive_taobao_behavior GROUP BY behavior_type; 商品销量TOP 10 sql SELECT item_id, COUNT(*) as sales FROM hive_taobao_behavior WHERE behavior_type = 'buy' GROUP BY item_id ORDER BY sales DESC LIMIT 10; 用户购买频率分析 sql SELECT user_id, COUNT(*) as purchase_count FROM hive_taobao_behavior WHERE behavior_type = 'buy' GROUP BY user_id ORDER BY purchase_count DESC LIMIT 20; 4. 结果导出到MySQL (1) 在MySQL创建结果表 sql CREATE TABLE behavior_stats ( behavior_type VARCHAR(10), count BIGINT ); CREATE TABLE item_sales_top10 ( item_id INT, sales BIGINT ); (2) 使用Sqoop导出Hive结果 bash # 导出用户行为统计 sqoop export \ --connect jdbc:mysql://localhost/taobao_analysis \ --username root \ --password yourpassword \ --table behavior_stats \ --export-dir /user/hive/warehouse/hive_taobao_behavior_stats \ --input-fields-terminated-by '\001' # 导出商品销量TOP10 sqoop export \ --connect jdbc:mysql://localhost/taobao_analysis \ --username root \ --password yourpassword \ --table item_sales_top10 \ --export-dir /user/hive/warehouse/item_sales_top10 \ --input-fields-terminated-by '\001' 5. 可视化分析(使用Excel) (1) 从MySQL导出CSV bash mysql -u root -p taobao_analysis -e "SELECT * FROM behavior_stats" > behavior_stats.csv mysql -u root -p taobao_analysis -e "SELECT * FROM item_sales_top10" > sales_top10.csv (2) 使用Excel制作图表 用户行为统计图: 打开behavior_stats.csv 选择数据 → 插入 → 柱状图 X轴:behavior_type,Y轴:count 商品销量TOP10: 打开sales_top10.csv 选择数据 → 插入 → 条形图 X轴:sales,Y轴:item_id我sqoop import \ --connect jdbc:mysql://localhost/taobao_analysis \ --username root \ --password yourpassword \ --table user_behavior \ --hbase-table taobao_behavior \ --column-family cf \ --hbase-row-key user_id \ --split-by user_id \ -m 1 # 伪分布式环境下减少并行任务数总是各种报错,怎么解决,有没有别的方法
最新发布
06-03
### 解决 Sqoop 导入 MySQL 数据到 HBase 的报错问题及替代方法 在使用 Sqoop 将 MySQL 数据导入到 HBase 时,可能会遇到多种错误。以下是一些常见问题的解决方法以及替代方案: #### 常见报错及解决方案 1. **JDBC 驱动问题** 如果 Sqoop 在连接 MySQL 数据库时抛出 `ClassNotFoundException` 或类似的异常,通常是因为缺少正确的 JDBC 驱动程序。需要确保 MySQL 的 JDBC 驱动(如 `mysql-connector-java.jar`)已正确放置在 Sqoop 的 `lib` 目录下[^1]。 2. **表结构不匹配** 当 Sqoop 导入数据时,如果目标 HBase 表的列簇或 RowKey 定义与 MySQL 表的结构不一致,可能导致报错。检查 MySQL 表和 HBase 表的映射关系是否正确,例如指定的 `--hbase-row-key` 是否存在于 MySQL 表中[^2]。 3. **RowKey 冲突** 如果未正确设置 `--hbase-row-key` 参数,Sqoop 可能无法生成唯一的 HBase RowKey,从而导致冲突。确保为每个记录生成一个唯一值作为 RowKey[^3]。 4. **性能问题** 使用 `--direct` 参数可以优化从 MySQL 到 HBase 的数据传输速度,但并非所有环境都支持该选项。如果启用后出现错误,建议禁用并调整 Mapper 数量以提高性能[^3]。 5. **HBase 表不存在** 如果目标 HBase 表尚未创建,可以通过添加 `--hbase-create-table` 参数让 Sqoop 自动创建表。但如果此参数无效,可能需要手动预先创建 HBase 表[^1]。 #### 替代方法 1. **使用 Apache Flume** Flume 是一种分布式、可靠且高可用的日志收集系统,也可以用于将 MySQL 数据流式写入 HBase。通过配置 Flume 的 Source 和 Sink,可以实现类似功能[^4]。 2. **使用 Apache Nifi** Apache Nifi 提供了图形化的界面来设计数据流任务,可以从 MySQL 中提取数据并通过内置处理器将其插入 HBase。这种方法更加灵活且易于维护[^5]。 3. **自定义 MapReduce 程序** 编写一个自定义的 MapReduce 程序,直接从 MySQL 数据库读取数据并写入 HBase。这种方式虽然复杂度较高,但提供了最大的灵活性[^6]。 ```python from pyhive import hive import pymysql # 连接 MySQL mysql_conn = pymysql.connect(host='mysql_host', user='user', password='password', db='db_name') cursor = mysql_conn.cursor() cursor.execute("SELECT * FROM table_name") data = cursor.fetchall() # 连接 Hive/HBase hive_conn = hive.Connection(host='hive_host', port=10000, username='hive_user') hive_cursor = hive_conn.cursor() # 插入数据到 HBase for row in data: hive_cursor.execute(f"INSERT INTO hbase_table (row_key, column_family:column) VALUES ('{row[0]}', '{row[1]}')") ``` #### 注意事项 - 替代方法的选择取决于具体需求、团队技术栈以及对实时性要求等因素。 - 如果决定继续使用 Sqoop,请仔细检查命令行参数,并参考官方文档验证每一步配置是否正确[^7]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值