全部产品
阿里云办公

步骤三:实验数据上传和加工

更新时间:2018-04-13 15:20:00

步骤三:实验数据上传和加工

操作步骤如下:

  1. 数据上传
  2. 了解推荐引擎基础数据模型
  3. 创建推荐引擎基础表
  4. 数据格式转换和加载

1. 数据上传

(1) 在odps的项目中,按照2.2中的表结构说明,分别创建表;

  1. -- 创建用户表(users)
  2. create table users(user_id bigint,
  3. age bigint,
  4. gender string,
  5. occupation string,
  6. zip_cod string)
  7. ;
  8. -- 创建电影表
  9. create table movies(movie_id bigint, movie_title string,
  10. release_date string, video_release_date string,
  11. IMDb_URL string, Unknown bigint,
  12. Action bigint, Adventure bigint,
  13. Animation bigint, Childrens bigint,
  14. Comedy bigint, Crime bigint,
  15. Documentary bigint, Drama bigint,
  16. Fantasy bigint, Film_Noir bigint,
  17. Horror bigint, Musical bigint,
  18. Mystery bigint, Romance bigint,
  19. Sci_Fi bigint, Thriller bigint,
  20. War bigint, Western bigint
  21. )
  22. ;
  23. -- 创建用户评分表(ratings)
  24. create table ratings(user_id bigint,
  25. movie_id bigint,
  26. rating bigint,
  27. timestamps bigint
  28. )
  29. ;

(2) 使用odps客户端(odpscmd)中的tunnel命令上传数据:

注意文件路径要输入正确,可以使用绝对路径:

  1. tunnel upload ./ml-100k/u.user users -fd "|" -rd "\n";
  2. tunnel upload ./ml-100k/u.item movies -fd "|" -rd "\n";
  3. tunnel upload ./ml-100k/u.data ratings -fd "\t" -rd "\n";

(3) 查看导入后的结果:

  1. read users 10;
  2. read movies 10;
  3. read ratings 20;

2. 了解推荐引擎基础数据模型

本章节内容为基础知识介绍,是附加阅读内容,可以帮助理解推荐引擎所需数据的内容和格式,便于做数据转换。已经了解的或者不想了解太多技术细节的同学可以跳过,不影响后续试验操作。

推荐引擎自带了一套数据模型,主要包括几类数据:用户数据、物品数据以及行为数据,具体格式规范请参考数据格式规范V3.0

推荐引擎会基于基础数据进行推荐分析,得到最终推荐结果。我们需要做的是:

1):在我们ODPS的项目空间中创建这些表;

2):按照推荐引擎数据模型的要求,使用ODPS SQL等将我们已有的业务数据插入到推荐引擎所需要的表中去。

3. 创建推荐引擎基础表

使用ODPS客户端工具odpscmd,登录执行以下建表脚本:

  1. -- 创建用户信息表(movielens_user_meta)
  2. create table movielens_user_meta (
  3. user_id string,
  4. tags string,
  5. plates string
  6. ) partitioned by (ds string)
  7. ;
  8. --创建用户属性维度表(movielens_user_meta_config
  9. create table movielens_user_meta_config (
  10. config_name string,
  11. config_value string
  12. ) partitioned by (ds string)
  13. ;
  14. -- 创建物品信息表(movielens_item_meta)
  15. create table movielens_item_meta (
  16. item_id STRING,
  17. category STRING,
  18. keywords STRING,
  19. description STRING,
  20. properties STRING,
  21. item_info STRING,
  22. update_datetime DATETIME,
  23. plates STRING
  24. ) partitioned by (ds string)
  25. ;
  26. --创建物品属性维度表(movielens_item_meta_config
  27. create table movielens_item_meta_config (
  28. config_name string,
  29. config_value string
  30. ) partitioned by (ds string);
  31. --创建用户行为表(movielens_user_behavior
  32. create table movielens_user_behavior (
  33. user_id STRING,
  34. act_obj STRING,
  35. obj_type STRING,
  36. bhv_type STRING,
  37. bhv_amt DOUBLE,
  38. bhv_cnt DOUBLE,
  39. bhv_datetime DATETIME,
  40. content STRING,
  41. pos_type STRING,
  42. position STRING,
  43. env STRING,
  44. trace_id STRING,
  45. plates STRING
  46. ) partitioned by (ds string)
  47. ;
  48. --创建可推荐物品表(movielens_rec_item_info
  49. create table movielens_rec_item_info (
  50. item_id STRING,
  51. item_info STRING,
  52. class STRING,
  53. plates STRING
  54. ) partitioned by (ds string)
  55. ;

4. 数据格式转换和加载

对已上传的业务数据进行加工处理,插入到推荐引擎的基础数据表中去,即把数据从 uses、movies以及 user_behavior中通过ODPS SQL的方式,转换成满足推荐引擎基础数据要求的格式,插入到对应的六张表中。

首先,将users信息插入到 movielens_user_meta 和 movielens_user_meta_config 中去:

  1. --创建 DUAL 表,用于单条记录插入
  2. create table dual (x string);
  3. insert overwrite table dual select 'x' from users limit 1;
  4. --插入用户信息表:
  5. insert overwrite table movielens_user_meta partition (ds='20170808')
  6. select user_id,concat('age\003',age,'\002gender\003',gender),null
  7. from users
  8. ;
  9. --插入用户属性维度表
  10. insert overwrite table movielens_user_meta_config partition (ds='20170808')
  11. select 'age','sv_num'
  12. from dual
  13. ;
  14. insert into table movielens_user_meta_config partition (ds='20170808')
  15. select 'gender','sv_enum'
  16. from dual
  17. ;

操作执行完成后,执行下面的命令可查看数据表内容:

  1. read movielens_user_meta partition (ds='20170808') 10;

接着,将用户行为数据插入到用户行为表 movielens_user_behavior 中:

  1. insert overwrite table movielens_user_behavior partition (ds='recent')
  2. select user_id, movie_id,'item', 'grade',rating, 1.0,
  3. FROM_UNIXTIME(timestamps),null, null, null, null, null, null
  4. from ratings
  5. ;

然后,把 movies 信息插入到 movielens_item_meta 和 movielens_item_meta_config 中去:

  1. insert overwrite table movielens_item_meta partition (ds='20170808')
  2. select movie_id, category,
  3. case when substr(keyword,-1)='\002' then substr(keyword,1,length(keyword)-1)
  4. else keyword end,
  5. description, properties, item_info,null,null
  6. from (select movie_id, null as category,
  7. concat(coalesce(concat(case when unknown=1 then 'unknown' end,'\002'),''),
  8. coalesce(concat(case when action=1 then 'action' end,'\002'),''),
  9. coalesce(concat(case when adventure=1 then 'adventure' end,'\002'),''),
  10. coalesce(concat(case when animation=1 then 'animation' end,'\002'),''),
  11. coalesce(concat(case when childrens=1 then 'childrens' end,'\002'),''),
  12. coalesce(concat(case when comedy=1 then 'comedy' end,'\002'),''),
  13. coalesce(concat(case when crime=1 then 'crime' end,'\002'),''),
  14. coalesce(concat(case when documentary=1 then 'documentary'
  15. end,'\002'),''),
  16. coalesce(concat(case when drama=1 then 'drama' end,'\002'),''),
  17. coalesce(concat(case when fantasy=1 then 'fantasy' end,'\002'),''),
  18. coalesce(concat(case when film_noir=1 then 'film_noir' end,'\002'),''),
  19. coalesce(concat(case when horror=1 then 'horror' end,'\002'),''),
  20. coalesce(concat(case when musical=1 then 'musical' end,'\002'),''),
  21. coalesce(concat(case when mystery=1 then 'mystery' end,'\002'),''),
  22. coalesce(concat(case when romance=1 then 'romance' end,'\002'),''),
  23. coalesce(concat(case when sci_fi=1 then 'sci_fi' end,'\002'),''),
  24. coalesce(concat(case when thriller=1 then 'thriller' end,'\002'),''),
  25. coalesce(concat(case when war=1 then 'war' end,'\002'),''),
  26. coalesce(case when western=1 then 'western' end,'')) as keyword,
  27. movie_title as description , null as properties,concat('IMDB_url\003', imdb_url) as item_info
  28. from movies) t
  29. ;

由于properties均为空,所以 movielens_item_meta_config 没有记录要插入,我们可以配置这张表,或者插入一条mock数据保证分区非空,语句如下:

  1. insert overwrite table movielens_item_meta_config partition (ds='20170808')
  2. select 'class','sv_enum' from dual;

如果表movielens_item_meta中所有的电影都可以作为推荐结果返回给用户,并且在返回给用户的时候,没有需要显示给用户的附加信息,则不需要创建该表,并且在推荐引擎控制台页面中“可推荐物品表”无需输入表名。在我们的例子中不需要创建该表。

如果其中某些电影不希望作为推荐结果返回给用户,则可以把可以推荐的电影插入到该表中,item_info 字段和movielens_item_meta表一致:

  1. insert overwrite table movielens_rec_item_info partition(ds='20170808')
  2. select movie_id,concat('IMDB_url\003', imdb_url),null,null
  3. from movies
  4. ;

至此,所有的数据转换和加载的工作就已经完成了,这部分工作要求使用者有一定的ODPS SQL的经验并且了解自己的业务数据,可以把业务数据按照推荐引擎基础数据表的要求进行简单处理。