【Sqoop+Hive+MySQL】使用者某時間範圍,區域最受歡迎的Top N的產品

loveheping發表於2018-01-20
一、建立配置檔案
【1、建立table_env檔案,增加如下內容】
執行命令:vi table_env
內容:

點選(此處)摺疊或開啟

  1. city_info=default.city_info
  2. product_info=default.product_info
  3. user_click=default.tmp_user_click
退出儲存(:wq)
注:等號前為RDBMS表,等號後為Hive表

二、從MySQL將資料匯入到Hive表中,並進行資料處理
【1、編寫匯入指令碼:建立mysql_to_hive.sh檔案,增加如下內容】
執行命令:vi mysql_to_hive.sh
內容:

點選(此處)摺疊或開啟

  1. #!/usr/bin/env bash

  2. source /app/works/user_env

  3. if [ $# != 2 ] ; then
  4. echo "USAGE: $0 資料庫表 Hive表"
  5. echo " e.g.: $0 'city_info' 'default.city_info'"
  6. echo " e.g.: $0 'product_info' 'default.product_info'"
  7. echo " e.g.: $0 'user_click' 'default.tmp_user_click'"
  8. exit 1;
  9. fi
  10. ### 匯入
  11. sqoop import --connect "${DB_VALUES}" \
  12. --username ${DB_USER} \
  13. --password-file /input/sqoop.pwd \
  14. --table $1 \
  15. --delete-target-dir \
  16. --fields-terminated-by "${INPUT_FIELDS_TERMINATED}" \
  17. --hive-import \
  18. --hive-overwrite \
  19. --hive-table $2 \
  20. -m 1
退出儲存(:wq)

執行命令:chmod 775 mysql_to_hive.sh

【2、編寫處理資料指令碼:建立hive_user_click.hql檔案,增加如下內容】
執行命令:vi  hive_user_click.hql
內容:

點選(此處)摺疊或開啟

  1. set hive.exec.dynamic.partition.mode=nonstrict;
  2. insert overwrite table user_click partition(action_time)
  3. select user_id,session_id,city_id,product_id,substring(action_time,1,10) action_time from tmp_user_click distribute by action_time
退出儲存(:wq)

【3、編寫迴圈組裝處理資料指令碼:建立import_sqoop_while.sh檔案,增加如下內容】
執行命令:vi import_sqoop_while.sh
內容:

點選(此處)摺疊或開啟

  1. #!/usr/bin/env bash
  2. source /app/works/user_env
  3. FILENAME=/app/works/table_env
  4. cat $FILENAME | while read LINE
  5. do
  6. db_table_name=`echo $LINE | cut -d \= -f 1`
  7. hive_table_name=`echo $LINE | cut -d \= -f 2`
  8. echo "***************************************************"
  9. echo "匯入${hive_table_name}資訊開始"
  10. echo "***************************************************"
  11. sh /app/works/mysql_to_hive.sh ${db_table_name} ${hive_table_name}
  12. done
  13. hive -f hive_user_click.hql
退出儲存(:wq)

執行命令:chmod 775 import_sqoop_while.sh

【4、執行指令碼】
./import_sqoop_while.sh

三、從Hive將資料匯入到MySQL表中,並進行資料處理
【1、建立配置檔案:建立user_env檔案,增加如下內容】
執行命令:vi user_env
內容:

點選(此處)摺疊或開啟

  1. export DB_IP_ADD=192.168.137.130
  2. export DB_PROT=3306
  3. export DB_DIRV=jdbc:mysql
  4. export DB_NAME=works
  5. export DB_USER=root
  6. export DB_VALUES="jdbc:mysql://192.168.137.130:3306/works?useUnicode=true&characterEncoding=utf-8"
  7. export INPUT_FIELDS_TERMINATED='\t'
  8. export HDFS_PATH='/works/tmp/'
退出儲存(:wq)

【2、建立HQL指令碼檔案:建立user_click.hql檔案,增加如下內容】
執行命令:vi user_click.hql
內容:
點選(此處)摺疊或開啟
  1. insert overwrite directory '${hivevar:hdfs_path}' ROW FORMAT DELIMITED FIELDS TERMINATED BY '${hivevar:field_term}' select * from (select c.area,p.product_name,
  2.        sum(rn) visit_num,
  3.        row_number()over(partition by c.area order by sum(rn) desc) rn,
  4.         '${hivevar:action_time}' action_time
  5.   from city_info c join (
  6.          select product_id,city_id,count(1) rn from user_click where action_time='${hivevar:action_time}' group by product_id,city_id
  7.        ) u join product_info p
  8.    on c.city_id = case when u.city_id is null then concat('cityid',rand()) else u.city_id end
  9.   and p.product_id = case when u.product_id is null then concat('prodid',rand()) else u.product_id end
  10.  group by c.area,p.product_name) a
  11. where a.rn <= 3;
退出儲存(:wq)

【3、建立從Hive匯出指令碼:建立hive_to_mysql.sh檔案,增加如下內容】
執行命令:vi hive_to_mysql.sh
內容:

點選(此處)摺疊或開啟

  1. #!/usr/bin/env bash
  2. source /app/works/user_env
  3. if [ $# != 1 ] ; then
  4. echo "USAGE: $0 日期引數"
  5. echo " e.g.: $0 '2018-01-01'"
  6. exit 1;
  7. fi
  8. ### 刪除資料庫中特定資料
  9. sqoop eval \
  10. --connect "${DB_VALUES}" \
  11. --username ${DB_USER} \
  12. --password-file /input/sqoop.pwd \
  13. --query "delete from user_click_rs where sdate='$1'"
  14. ### 匯出hive表中資料到HDFS
  15. hive -hivevar action_time=$1 -hivevar field_term=${INPUT_FIELDS_TERMINATED} -hivevar hdfs_path=${HDFS_PATH} -f /app/works/user_click.hql
  16. ### 匯出HDFS資料到資料庫中
  17. sqoop export --connect "${DB_VALUES}" \
  18. --username ${DB_USER} \
  19. --password-file /input/sqoop.pwd \
  20. --table user_click_rs \
  21. --export-dir ${HDFS_PATH} \
  22. --input-fields-terminated-by "${INPUT_FIELDS_TERMINATED}"
退出儲存(:wq)

執行命令:chmod 775 hive_to_mysql.sh

【4、執行指令碼】
./hive_to_mysql.sh '2016-05-05'

四、測試需要資訊
【1、MySQL資訊】
1.1、建立MySQL資料庫
點選(此處)摺疊或開啟
  1. create database works DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
1.2、建立表

點選(此處)摺疊或開啟

  1. --城市表
  2. create table city_info(
  3. city_id int,
  4. city_name varchar(255),
  5. area varchar(255)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  7.  
  8. --產品表
  9. create table product_info(
  10. product_id int,
  11. product_name varchar(50),
  12. extend_info varchar(100)
  13. )ENGINE=InnoDB DEFAULT CHARSET=utf8;

  14. -- 使用者點選表
  15. create table user_click(
  16. user_id int,
  17. session_id varchar(50),
  18. action_time varchar(30),
  19. city_id int(11),
  20. product_id int(11)
  21. )ENGINE=InnoDB DEFAULT CHARSET=utf8;

  22. --統考結果表
  23. create table user_click_rs(
  24. area varchar(50),
  25. product_name varchar(50),
  26. visit_num int(11),
  27. rn int(11),
  28. sdate varchar(10)
  29. )ENGINE=InnoDB DEFAULT CHARSET=utf8;
【2、Hive資訊】
建立HIve表

點選(此處)摺疊或開啟

  1. --使用者點選表
  2. create external table user_click(
  3. user_id string,
  4. session_id string,
  5. city_id string,
  6. product_id string
  7. )
  8. partitioned by (action_time string)
  9. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
  10. location '/works/user_click';
  11. --使用者點選臨時表
  12. create external table tmp_user_click(
  13. user_id string,
  14. session_id string,
  15. action_time string,
  16. city_id string,
  17. product_id string
  18. )
  19. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
  20. location '/works/tmp_user_click';
  21. --城市表
  22. create external table city_info(
  23. city_id int,
  24. city_name string,
  25. area string
  26. )
  27. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
  28. location '/works/city_info';
  29. --產品表
  30. create external table product_info(
  31. product_id int,
  32. product_name string,
  33. extend_info string
  34. )
  35. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
  36. location '/works/product_info';



若澤大資料交流群:671914634

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31511218/viewspace-2150356/,如需轉載,請註明出處,否則將追究法律責任。

相關文章