将数据从mysql导入到hive表

本文介绍了一种使用Bash脚本从MySQL数据库导出数据至文本文件的方法,然后通过Hive加载至指定表分区,实现数据的高效迁移。详细步骤包括设置数据库连接参数、执行SQL查询、结果输出至文件及Hive数据加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码脚本如下:

#!/bin/bash
# 连接mysql数据库,并查询结果,将结果输出到文件中
# 1.定义连接变量
mysql_hostname='172.28.65.133'
mysql_port='3306'
mysql_username='root'
mysql_password='xxxxxx'
#
dbname='recom_video'
time=`date -d "1 day ago" +"%Y-%m-%d"`
save_f="t_st_video_info_${time}.txt"
save_p="/data/recommend/"
#
mysql_sq="select 
        IFNULL(id,''),
        IFNULL(video_id,''),
        IFNULL(video_name,''),
        IFNULL(video_desc,''),
        IFNULL(video_url,''),
        IFNULL(hits_num,''),
        IFNULL(praise_num,''),
        IFNULL(create_time,''),
        IFNULL(update_time,'')
from t_st_video_info 
where create_time <= '${time} 23:59:59'"

echo "开始链接数据库..."

# 2.连接数据库
result=`mysql -h${mysql_hostname} -P${mysql_port} -u${mysql_username} -p${mysql_password} << EOF
use recom_video;
$mysql_sq;
quit
EOF`

# 判断是否连接成功
if [ $? = 0 ] 
then
 echo "连接成功。。。"
else
 echo "连接失败。。。"
 exit
fi
echo "写入查询结果..."

# 将结果写入文本
echo "$result" | tail -n +2 | sed 's/\t/,/g' >> $save_p$save_f
echo "写入完成..."

#
target_table="t_di_video_info_ad"
op_time=`date -d "1 day ago" +"%Y%m%d"`

hive -e "alter table ${target_table} drop partition(dayid='$op_time');"
hive -e "use recommend_video;load data local inpath'$save_p$save_f' overwrite into table ${target_table} partition(dayid='${op_time}');"

 

hive表:

CREATE TABLE `t_di_video_info_ad`(
  `id` int, 
  `video_id` string, 
  `video_name` string, 
  `video_desc` string, 
  `video_url` string, 
  `hits_num` string, 
  `praise_num` string, 
  `create_time` string, 
  `update_time` string)
COMMENT '视频信息表'
PARTITIONED BY ( `dayid` string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' STORED AS TEXTFILE

 

SQL:

load data inpath '/recommend/video/t_st_video_info.txt' into table video_info PARTITION (date = '20200608');

 

 

<think>好的,用户现在需要将MySQL数据转为latin1,以便用Sqoop导入到Hive中。首先,我需要回想一下之前用户询问过如何修改MySQL的字符编码,那次是转为utf8mb4,现在反过来要转成latin1,可能是遇到了导入过程中的编码问题。 首先,得确认用户为什么需要转为latin1。通常来说,Sqoop在导入数据Hive时,如果两边编码不一致可能会有问题,特别是如果Hive默认是latin1的话。但Hive一般使用UTF-8,所以这里可能存在一些特殊情况,比如旧系统兼容性,或者数据本身不需要多语言支持,只需要基础拉丁字符。 接下来,用户的需求可能涉及到Sqoop的导入命令是否需要指定字符集,或者在MySQL端转换数据。需要考虑到转换编码可能带来的数据丢失,特别是如果MySQL中有非拉丁字符的话,比如中文或情符号,转成latin1会导致乱码或者错误,所以必须提醒用户先检查数据是否兼容。 然后,步骤方面,用户可能需要修改MySQL的字符集设置,但之前已经介绍过修改方法,这次需要调整成latin1。需要注意的是,修改数据库、和列的字符集,可能需要使用ALTER语句,同时要处理已有数据,可能需要导出再导入,或者直接转换。另外,动态修改全局变量和配置文件的方法也需要调整,将之前的utf8mb4替换为latin1。 另外,Sqoop的导入命令需要添加--connection-param选项来指定字符集,确保在导入过程中使用正确的编码。同时,Hive的元数据可能也需要设置为latin1,否则即使数据正确导入,Hive可能仍会错误解析。 还需要提醒用户测试数据,插入一些样例数据,检查导入后的结果是否正确,避免数据损坏。此外,备份数据是必须的,特别是在修改字符集这种高风险操作前。 可能的陷阱包括:数据丢失、Sqoop连接参数不正确、Hive编码设置不匹配。需要逐一说明这些注意事项,确保用户操作时不会遗漏关键步骤。 最后,总结用户的需求,可能是为了简化导入过程,或者兼容旧系统,但必须强调latin1的局限性,建议如果可能的话,还是使用UTF-8,以避免未来扩展性问题。但如果确实需要,按照步骤操作,并做好数据检查和备份。</think>将MySQL数据转换为`latin1`字符集以便通过Sqoop导入Hive时,需注意编码兼容性和数据完整性。以下是详细操作步骤及注意事项: --- ### **一、为何需要转`latin1`?** - **Sqoop与Hive的默认兼容性**:部分Hive环境默认使用`latin1`编码,若MySQL使用`utf8mb4`等编码,直接导入可能导致乱码。 - **特殊场景需求**:若数据仅包含ASCII字符(如英文、数字),`latin1`可简化编码处理。 --- ### **二、MySQL数据转`latin1`操作** #### **1. 检查当前数据编码** ```sql -- 查看数据库、、字段的字符集 SHOW CREATE DATABASE 数据库名; SHOW CREATE TABLE 名; ``` #### **2. 修改数据库/字符集** ```sql -- 修改数据库编码 ALTER DATABASE 数据库名 CHARACTER SET latin1 COLLATE latin1_swedish_ci; -- 修改编码(仅修改元数据,不转换数据) ALTER TABLE 名 CHARACTER SET latin1 COLLATE latin1_swedish_ci; -- 修改字段编码(若字段单独指定了其他编码) ALTER TABLE 名 MODIFY 字段名 VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci; ``` #### **3. 导出数据并重新导入(彻底转换)** 若中已有数据,直接修改字符集可能不会转换现有数据编码,需导出后重新导入: ```bash # 导出数据(指定编码为当前实际编码,如utf8) mysqldump -u用户 -p --default-character-set=utf8 数据库名 名 > data.sql # 修改导出的SQL文件编码为latin1 iconv -f utf8 -t latin1 data.sql > data_latin1.sql # 重新导入(确保目标已设为latin1) mysql -u用户 -p --default-character-set=latin1 数据库名 < data_latin1.sql ``` --- ### **三、Sqoop导入Hive命令** 在Sqoop命令中显式指定连接参数,确保编码一致性: ```bash sqoop import
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值