使用Sqoop将Hive数据导出到TiDB

news/2024/5/19 12:52:06 标签: hive, sqoop, tidb

关系型数据库与大数据平台之间的数据传输之前写过一些
使用Sqoop将数据在HDFS与MySQL互导
使用Sqoop将SQL Server视图中数据导入Hive
使用DataX将Hive与MySQL中的表互导
使用Sqoop将Hive数据导出到TiDB虽然没写过,但网上一堆写的,那为什么我要专门写一下呢?
我发现一些大家可能会忽略但很重要的地方!
所以,请继续看下去,你肯定会有收获的!!!


文章目录

    • 1 建Hive表
    • 2 建TiDB表
    • 3 Sqoop 脚本
    • 4 问题排查
    • 5 问题处理

1 建Hive表

注意分隔符 ‘\001’,用别的也可以,但要和Sqoop命令一致

create table test_table(
     contract_no                         string                  COMMENT '合同号'
    ,plan_date                           date                    COMMENT '应还日期'
    ,dt                                  string                  COMMENT '数据日期'
)
comment '测试表'
row format delimited fields terminated by '\001'
;

2 建TiDB表

注意TiDB表多了个自增主键 id

create table test_table(
     id bigint PRIMARY KEY AUTO_INCREMENT
    ,contract_no                         varchar(50)             COMMENT '合同号'
    ,plan_date                           date                    COMMENT '应还日期'
    ,dt                                  varchar(10)             COMMENT '数据日期'
);

3 Sqoop 脚本

注意如果源表和目标表字段不完全相同,可以使用 --columns 选取部分字段,这里因为TiDB表多一个自增id,使用 --columns “contract_no,plan_date,dt”

#!/bin/sh
source /etc/profile
sqoop export --D mapred.job.queue.name=xxx \
--connect jdbc:mysql://xxx:3306/xxx \
--username xxx \
--password xxx \
--table test_table \
--export-dir /user/hive/warehouse/dwd.db/test_table/ \
--input-fields-terminated-by '\001' \ # 与hive表分隔符一致
--num-mappers 5 \ # 根据数据量确定,写太大会导致小文件过多,太小跑不动
--input-null-string '\\N' \ # 将字符串类型字段中的\N替换为null
--input-null-non-string '\\N' \ # 将非字符串类型字段中的\N替换为null
--columns "contract_no,plan_date,dt"

上面是将hive数据export导出到tidb。注意在hive中null值默认存储成了\N(可修改),所以在import导入Hive时需要加下面命令。注意export和import区别!!!

--null-string '\\N' \ # 将字符串类型字段中的null值替换为\N
--null-non-string '\\N' \ # 将非字符串类型字段中的null值替换为\N

4 问题排查

查看报错日志,注意加粗部分,Sqoop会生成一个“同步表名.java”文件,查看报错所在行,定位问题。
Caused by: java.lang.RuntimeException: Can’t parse input data: ‘\N’
at test_table.__loadFromFields(test_table.java:765)
at test_table.parse(test_table.java:648)
at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:83)
… 10 more
Caused by: java.lang.IllegalArgumentException
at java.sql.Date.valueOf(Date.java:143)
at test_table.__loadFromFields(test_table.java:722)
… 12 more
找到722行,发现plan_date字段有null值,因为hive中null值存储成了\N,而该字段是date类型,从hivetidb时插不进去。
if (__cur_str.equals(“null”) || __cur_str.length() == 0) { this.plan_date = null; } else {
this.plan_date = java.sql.Date.valueOf(__cur_str);
}

5 问题处理

经过上面排查,问题已经定位到plan_date字段中有null值,有两个解决方案,一是将null值替换为默认值,一是保留null值,加上下面两个参数。因为hive中null值默认存储成了\N(可修改)!!!
–input-null-string ‘\N’ \ # 将字符串类型字段中的\N替换为null
–input-null-non-string ‘\N’ \ # 将非字符串类型字段中的\N替换为null
PS:TiDB表加索引不影响Sqoop
CREATE INDEX idx_source_date ON tabname(col1, col2);


http://www.niftyadmin.cn/n/5318223.html

相关文章

LeetCode 2645.构造有效字符串的最少插入数:O(n) + O(1)

【LetMeFly】2645.构造有效字符串的最少插入数:O(n) O(1) 力扣题目链接:https://leetcode.cn/problems/minimum-additions-to-make-valid-string/ 给你一个字符串 word ,你可以向其中任何位置插入 "a"、"b" 或 "…

初识Hadoop-概述与关键技术

一.大数据概述 1.什么是大数据 高速发展的信息时代,新一轮科技革命和变革正在加速推进,技术创新日益成为重塑经济发展模式和促进经济增长的重要驱动力量,而“大数据”无疑是核心推动力。 那么,什么是“大数据”呢&#xff1…

iOS rootless无根越狱解决方案

据游戏工委数据统计,2023年国内游戏市场实际销售收入与用户规模双双创下新高,游戏普遍采用多端并发方式,成为收入增长的主因之一。 中国市场实际销售收入及增长率丨数据来源:游戏工委 多端互通既是机遇,也是挑战。从游…

Tomcat-快速使用

关于Tomcat的概念及来由在Tomcat基本知识中进行了介绍,下面我们直接上手快速使用起来。 一、快速使用 (1)tomcat下载 (2)解压缩 (3)启动程序 (4)访问tomcat&#xff1a…

Kotlin程序设计(二)面向对象

Kotlin程序设计中级篇 我们在前面已经学习了Kotlin程序设计的基础篇,本章我们将继续介绍更多Kotlin特性,以及面向对象编程。 函数 其实函数我们在一开始就在使用了: fun main() {println("Hello World") }我们程序的入口点就是…

力扣日记1.10-【二叉树篇】701. 二叉搜索树中的插入操作

力扣日记:【二叉树篇】701. 二叉搜索树中的插入操作 日期:2024. 参考:代码随想录、力扣 —————————————————————— 天哪,上次打开力扣还是2023,转眼已经2024?! 两个星期过去…

如何从 Keras 中的深度学习目录加载大型数据集

一、说明 数据集读取,使用、在磁盘上存储和构建图像数据集有一些约定,以便在训练和评估深度学习模型时能够快速高效地加载。本文介绍Keras 深度学习库中的ImageDataGenerator类等工具自动加载训练、测试和验证数据集。 二、ImageDataGenerator加载数据集…

[计算机提升] 创建FTP共享

4.7 创建FTP共享 4.7.1 FTP介绍 在Windows系统中,FTP共享是一种用于在网络上进行文件传输的标准协议。它可以让用户通过FTP客户端程序访问并下载或上传文件,实现文件共享。 FTP共享的用途非常广泛,例如可以让多个用户共享文件、进行文件备份…