最近在搭建大数据仓库。
后面会专门写一下搭建指南。今天小小记录一下数据导入过程中遇到的问题。
场景:
从mysql数据库导入表到hive,作为ods层数据。
但是blob数据类型导入到hive时并没有对应的数据类型。
先说一下数据抽取步骤:(学习教程:23-【项目实战】环境搭建01(虚拟机)_哔哩哔哩_bilibili)
1. sqoop数据抽取到hdfs
#!/bin/bash
db_date=$2
echo $db_date
db_name=mall
import_data() {
sqoop import \
--connect jdbc:mysql://node02:3306/$db_name \
--username root \
--password DBa2020* \
--target-dir /origin_data/$db_name/db/$1/$db_date \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query "$2"' and $CONDITIONS;'
}
import_order_info(){
import_data "order_info" "select
id,
total_amount,
order_status,
user_id,
payment_way,
out_trade_no,
create_time,
operate_time
from order_info
where (DATE_FORMAT(create_time,'%Y-%m-%d')='$db_date' or DATE_FORMAT(operate_time,'%Y-%m-%d')='$db_date')"
}
case $1 in
"order_info")
import_order_info
;;
esac
保存为sqoop_import.sh, 运行:./sqoop_import.sh order_info 2022-12-16
2. hive中建表
-- 创建数据库
create database if not exists mall;
use mall;
-- 创建订单表
drop table if exists ods_order_info;
create table ods_order_info (
`id` string COMMENT '订单编号',
`total_amount` decimal(10,2) COMMENT '订单金额',
`order_status` string COMMENT '订单状态',
`user_id` string COMMENT '用户id' ,
`payment_way` string COMMENT '支付方式',
`out_trade_no` string COMMENT '支付流水号',
`create_time` string COMMENT '创建时间',
`operate_time` string COMMENT '操作时间'
) COMMENT '订单表'
PARTITIONED BY ( `dt` string)
row format delimited fields terminated by '\t'
location '/warehouse/mall/ods/ods_order_info/'
tblproperties ("parquet.compression"="snappy")
;
保存为ods_ddl.sql, 运行:hive -f ods_ddl.sql
关于mysql到hive数据类型的对应关系可以参考该表:
3. 将hdfs内容导入到hive
#!/bin/bash
do_date=$1
APP=mall
hive=hive
sql="
load data inpath '/origin_data/$APP/db/order_info/$do_date' OVERWRITE into table $APP"".ods_order_info partition(dt='$do_date');
"
$hive -e "$sql"
遇到的问题:mysql的blob类型在hive中没有对应的数据类型。
我们的mysql里面blob类型数据主要存的是json格式的数据。
如:
[114580,114728,114799,114946,114948,232119,232120,232122,232146]
解决方法:
参考的这篇博文:sqoop 导入mysql blob字段,Sqoop导入的数据格式问题_无敌米修的博客-CSDN博客
数据抽取到HDFS时将blob对应的列指定为string
如果out_trade_no列为blob类型,则加入如下两行
import_data() {
sqoop import \
--connect jdbc:mysql://node02:3306/$db_name \
--username root \
--password DBa2020* \
--map-column-java out_trade_no=String \
--map-column-hive out_trade_no=String \
--target-dir /origin_data/$db_name/db/$1/$db_date \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query "$2"' and $CONDITIONS;'
}
后面正常导入并写入hive即可。在hive数据库中对应类型为string。