Datax从Hive中导出数据写入到MySQL

读取Hive数据时,Datax内部支持的数据类型

Hive1.2.x 版本支持的数据类型已经很丰富了,但是Datax目前还支持不了这么多的数据类型,如果不注意的话,将会抛出很多奇怪的问题:比如 脏数据 的问题。

DataX 内部类型 Hive表 数据类型
Long TINYINT,SMALLINT,INT,BIGINT
Double FLOAT,DOUBLE
String String,CHAR,VARCHAR,STRUCT,MAP,ARRAY,UNION,BINARY
Boolean BOOLEAN
Date Date,TIMESTAMP

这里在官网中也有说明:传送门

脏数据错误类型的解决方法

通常在数仓中,为保证计算数据的准确性,我们会设计一些精度较高的数据类型,比如timestamp。
但当我们借助datax-web来自动完成字段映射的时候,通常不会将timestamp修改为datax内容支持的date类型,这个时候需要手动修改json中对应的字段为date。

2020-05-08 18:18:10.284 [0-0-0-reader] ERROR StdoutPluginCollector - 脏数据: 
{"message":"No enum constant com.alibaba.datax.plugin.reader.hdfsreader.DFSUtil.Type.TIMESTAMP","record":[],"type":"reader"}
2020-05-08 18:18:10.285 [0-0-0-reader] ERROR StdoutPluginCollector - 脏数据: 
{"message":"No enum constant com.alibaba.datax.plugin.reader.hdfsreader.DFSUtil.Type.TIMESTAMP","record":[],"type":"reader"}
2020-05-08 18:18:10.286 [0-0-0-reader] ERROR StdoutPluginCollector - 脏数据: 
{"message":"No enum constant com.alibaba.datax.plugin.reader.hdfsreader.DFSUtil.Type.TIMESTAMP","record":[],"type":"reader"}
2020-05-08 18:18:10.286 [0-0-0-reader] ERROR StdoutPluginCollector - 脏数据: 
{"message":"No enum constant com.alibaba.datax.plugin.reader.hdfsreader.DFSUtil.Type.TIMESTAMP","record":[],"type":"reader"}
2020-05-08 18:18:10.287 [0-0-0-reader] ERROR StdoutPluginCollector - 脏数据: 
{"message":"No enum constant com.alibaba.datax.plugin.reader.hdfsreader.DFSUtil.Type.TIMESTAMP","record":[],"type":"reader"}
2020-05-08 18:18:10.287 [0-0-0-reader] ERROR StdoutPluginCollector - 脏数据: 
{"message":"No enum constant com.alibaba.datax.plugin.reader.hdfsreader.DFSUtil.Type.TIMESTAMP","record":[],"type":"reader"}
2020-05-08 18:18:10.288 [0-0-0-reader] ERROR StdoutPluginCollector - 脏数据: 
{"message":"No enum constant com.alibaba.datax.plugin.reader.hdfsreader.DFSUtil.Type.TIMESTAMP","record":[],"type":"reader"}
2020-05-08 18:18:10.289 [0-0-0-reader] ERROR StdoutPluginCollector - 脏数据: 
{"message":"No enum constant com.alibaba.datax.plugin.reader.hdfsreader.DFSUtil.Type.TIMESTAMP","record":[],"type":"reader"}
2020-05-08 18:18:10.289 [0-0-0-reader] ERROR StdoutPluginCollector - 脏数据: 
{"message":"No enum constant com.alibaba.datax.plugin.reader.hdfsreader.DFSUtil.Type.TIMESTAMP","record":[],"type":"reader"}
2020-05-08 18:18:10.293 [0-0-0-reader] INFO  Reader$Task - end read source files...

这里就需要将json中的timestamp类型修改为date类型处理,如果精度很高的话,可以将类型修改为String。

如果还有其他脏数据类型的错误,可以参考上面提到的datax内部支持的数据类型,将字段调整为支持的数据类型即可解决脏数据类型错误。

附上脱敏后的json文件:

{
   
   
    "job": {
   
   
        "setting": {
   
   
            "speed": {
   
   
                "channel": 3
            }
<think>嗯,用户这次在DataX数据同步场景中有明确指向性需求:需要将Hive数据同步到MySQL的配置方案。结合历史对话和当前引用信息可以看出几个关键点:用户引用的两个信息片段存在技术关联性但场景错位:引用[1]演示的是HDFS到MySQLDataX调用命令,引用[2]描述的是MySQL到HDFS的同步原理。两者方向相反,且用户实际需要的是HiveMySQL的方案,这提示需要澄清技术链条——Hive本身不直接支持DataX读写,必须通过HDFS中转。在配置层面需要重点解决三个技术环节:Hive数据如何通过HDFS导出(实质是HDFSReader配置)、MySQLWriter的字段映射、特殊类型转换(如Hive的复杂类型需预处理)。尤其要注意用户在历史对话中强调过全量同步需求,因此配置示例里刻意省略了where条件。考虑到用户提供的引用里出现过QuerySQLMode,可能需要特别提醒用户:虽然示例配置为TableMode,但如果需要复杂数据过滤或字段处理,可以在reader中改用querySql参数。不过由于Hive表转MySQL通常需要清洗,更推荐先在Hive层用SQL预处理再同步基础表。最后保留的拓展问题设计意图是:用户当前只问基础配置,但实际部署时必然面临性能调优问题(比如Hive分区表同步),把全量/增量这个关键决策点作为首问能自然延伸需求边界;空值处理则是实际同步最常见的异常场景之一,作为第二问也很实用。</think> 以下是完整可靠的 DataX 同步 Hive 数据MySQL 的解决方案,包含配置方法、案例和注意事项: ### 一、技术原理 1. **数据流路径**:Hive表 → HDFS → DataXMySQL(需先将 Hive数据导出到 HDFS) 2. **核心组件**: - Reader:`hdfsreader` 读取 Hive 对应的 HDFS 数据文件 - Writer:`mysqlwriter` 写入 MySQL 目标表 ### 二、完整配置案例(`hivetomysql.json`) ```json { "job": { "content": [ { "reader": { "name": "hdfsreader", "parameter": { "path": "/user/hive/warehouse/db_name.db/table_name/*", // Hive表在HDFS的存储路径 "defaultFS": "hdfs://namenode:8020", "column": [ {"index": 0, "type": "string"}, // 字段索引及类型 {"index": 1, "type": "int"}, {"index": 2, "type": "date"} ], "fileType": "text", // Hive默认文本格式 "encoding": "UTF-8", "fieldDelimiter": "\t" // Hive默认分隔符 } }, "writer": { "name": "mysqlwriter", "parameter": { "writeMode": "insert", // 全量插入模式 "username": "mysql_user", "password": "mysql_password", "connection": [ { "jdbcUrl": "jdbc:mysql://mysql_host:3306/target_db", "table": ["target_table"] } ], "column": ["col1", "col2", "col3"] // MySQL目标表字段名 } } } ] } } ``` ### 三、操作步骤 1. **前置准备**: ```bash # 确认Hive表在HDFS的路径 hdfs dfs -ls /user/hive/warehouse/db_name.db/table_name ``` 2. **执行同步**: ```bash cd /software/datax/bin python datax.py /software/datax/job/hivetomysql.json ``` ### 四、关键配置说明 | 组件 | 参数 | 注意事项 | |------|------|----------| | **hdfsreader** | `path` | 支持`*`通配符匹配分区数据 | | | `fieldDelimiter` | 需与Hive建表分隔符一致 | | **mysqlwriter** | `writeMode` | 可选`replace`(覆盖)或`insert`(追加) | | | `column` | MySQL字段名需与Hive字段顺序严格对应 | ### 五、常见问题处理 1. **类型转换异常** - 在Hive层用CAST转换类型: ```sql CREATE TABLE tmp_table AS SELECT CAST(int_col AS STRING), date_col FROM source_table; ``` 2. **分隔符不匹配** - 在Hive中重建表指定分隔符: ```sql CREATE TABLE reformat_table ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; ``` > **特殊场景**:若需同步增量数据,可添加where条件: > ```json > "reader": { > "parameter": { > "path": "/user/hive/warehouse/db/order_table/dt=2023*", // 按分区增量 > ... > } > } > ``` [^1]: DataX官方文档推荐通过HDFS中转实现Hive同步 [^2]: 字段映射需确保HiveMySQL的元数据对齐
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值