mysql数据库中的blob数据类型如何导入到hive中

最近在搭建大数据仓库。

后面会专门写一下搭建指南。今天小小记录一下数据导入过程中遇到的问题。

场景:

从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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值