这里先给出需求:
统计每个区域下最受欢迎的产品TOP3,现有三张已经过简单清洗的数据表。
目标表的所需字段:product_id,product_name,product_status,area,click_count,rank,grade,day
字段意思:产品编号,产品名称,产品状态,区域,点击量,排名,等级,天数。
而我们手头上有一张产品数据表,区域信息表和一张用户日志表,前两张表存储在MySQL里面,而后面的这张表是以文本格式存放在HDFS上面。
工作流程:
使用sqoop把MySQL上面的表的数据迁移到HDFS上面,然后我们将使用hive来构建我们的目标表.
第一步,先将MySQL上面的数据迁移到HDFS上面,使用的工具是sqoop,命令为import
现在在MySQL上面我们有这两个表city_info和product_info,我们要将其导入到HDFS上的指定目录上面,我们这次只是导入HDFS上面并不同时构建hive表,hive表等会我们手动构建和添加数据。
sqoop import --connect jdbc:mysql://hadoop001:3306/ruozedata --username root --password xxxx --table city_info --target-dir /user/hive/warehouse/doudou_db.db/doudou_city -m 1
这里将要使用的库写在了connect里面了,而要导入的表使用参数table来指定,目标路径使用参数target-dir指定,这里只用一个map,因为city_info这个表是没有主键的或者你为其指定一个字段来分割也可以(使用参数split-by,这样就可以使用多个map了)
同理,将product_info这个表导入到HDFS上也是这样的做法,只要修改一下参数table和指定的目录就行了。
然后,我们在Hadoop的50070web界面就能看到多了两个文件夹了。
接着,我们现在所需要的表都在HDFS上面了,现在需要使用hive来构建这三个表。
在hive上构建表:create table tab_name(col_name data_type, ....) row format delimited fields terminated by ','; 因为我从MySQL上导表的时候。然后导入数据load data inpath '.....' overwrite into table tab_name;
完成了上面的步骤后,现在我们在hive上就有了可以操作的素材了,后面我们在根据需求分析一下,要怎么构建我们的目标表,剩下的就像写SQL一样了。
现在分析一下我们的需求,第一我们要将区域信息和产品信息添加到用户行为数据上,这样数据就全了,使用表格链接来完成。第二,目标表需要根据区域和产品类型对产品进行点击量排序和等级,这样就是典型的聚合分组的使用方法了。但我们只需要前3名,所以我们要得到不同区域和产品的具体点击量,再把前三的保留同时给予等级,这里会使用到case when then这个语法。
create table user_city as select u.product_id,u.city_id,c.city_name,c.area from user_click u left join city_info c on u.city_id=c.city_id;
将用户日志表和区域表进行连接,同时创建一个user_city表,如果在生产上面我们可以使用view来构建
create table user_city_rank as select u.product_id,u.area ,count(1) from user_city_info u group by u.product_id,u.area; 对数据进行分组
最后将产品信息也添加到里面去 create table user_product_city as select u.product_id,p.product_name,get_json_object(p.extend_info,”$.product_status") as product_status,u.area,u.click_count,u.rank from user_city_click u left join product_info p on u.product_id=p.product_info where u.rank < 4; 这里要注意几个地方,就是我们使用函数get_json_object来解析一个字段的json格式时,key值前面都要调价$.这个符号。
具体的实现就小伙伴们自己好好做了,最后能写成一个bash脚本