网站做百度竞价引流费用多少钱,知页wordpress,wordpress付费主题破解版,濮阳seo网站建设关系型数据库与大数据平台之间的数据传输之前写过一些 使用Sqoop将数据在HDFS与MySQL互导 使用Sqoop将SQL Server视图中数据导入Hive 使用DataX将Hive与MySQL中的表互导 使用Sqoop将Hive数据导出到TiDB虽然没写过#xff0c;但网上一堆写的#xff0c;那为什么我要专门写一下…关系型数据库与大数据平台之间的数据传输之前写过一些 使用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.namexxx \
--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值替换为\N4 问题排查
查看报错日志注意加粗部分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类型从hive到tidb时插不进去。 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 PSTiDB表加索引不影响Sqoop CREATE INDEX idx_source_date ON tabname(col1, col2);