datax--从hdfs分区表写入mysql分区字段为空

博客讲述从HDFS向MySQL推送数据时遇到的问题。原本想让DataX读取分区目录作为字段处理,但推送后分区字段为null。后新建非分区接口表推送,字段正常。还介绍了官网按分区读取的方法,即配置好json中path的值。

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

从hdfs分区表写入mysql分区字段为空

背景

  • 需要从hdfs将以月为分区分区表中的数据全量推到mysql中
  • 分区表的分区字段在hdfs上为目录形式,也就是说其实是假字段
  • 我本来想的是把path直接配置成这种格式,datax会读取到分区目录,作为字段处理,毕竟我们直接从hive查询分区表,分区目录就是直接作为字段进行展示的。
 "path": "/user/hive/warehouse/mytable01/*
  • 28就是那个分区monthkey
"column": [
                {"index":0 ,"type":"string"},
                ……
                {"index":28,"type":"string"}
            ],
  • mysqlwriter中也配置了column列信息
"column": [
                 "date_short",."monthkey"
            ],

结果

  • 推送过去之后,发现分区字段monthkey为null

解决

  • 我又新建了一张接口表,把分区字段作为真字段(即新表不是分区表),推送过去,字段不为null了
  • 这个接口表本来就是需要的,因为除了第一次我们是全量推送,之后就是每天推送最近两个月的了,只不过处于开发阶段,我就省略了,结果发现了这个错误,datax对分区表的读取path必须指定到分区目录,才能读取到这个分区字段?还是说我的理解有误,有大神知道可以指导一下。

官网的按分区读取

  • 按分区读取
  • Hive在建表的时候,可以指定分区partition,例如创建分区partition(day=“20150820”,hour=“09”),对应的hdfs文件系统中,相应的表的目录下则会多出/20150820和/09两个目录,且/20150820是/09的父目录。了解了分区都会列成相应的目录结构,在按照某个分区读取某个表所有数据时,则只需配置好json中path的值即可。
  • 比如需要读取表名叫mytable01下分区day为20150820这一天的所有数据,则配置如下:
"path": "/user/hive/warehouse/mytable01/20150820/*"

参考文档:https://github.com/alibaba/DataX/blob/master/hdfsreader/doc/hdfsreader.md

### 数据同步方案概述 DataX 是阿里巴巴开源的一款异构数据源离线同步工具,支持多种数据库之间的数据传输。要实现 Hive 分区表中的数据同步到 MySQL 的场景,可以按照以下方式设计配置文件并完成任务。 #### 1. DataX 配置基础结构 DataX 使用 JSON 文件作为其核心配置文件,主要分为 `job` 和 `content` 两大部分。其中 `job` 定义了整体的任务属性,而 `content` 则描述具体的读取器 (`reader`) 和写入器 (`writer`) 设置[^1]。 #### 2. Reader 插件 (HiveReader) 对于 Hive 表的数据读取,需使用 `hive` 类型的 reader 插件。如果目标表是一个分区表,则需要通过动态参数来指定所需的分区信息[^3]。例如: ```json { "name": "hivereader", "parameter": { "defaultFS": "hdfs://nameservice1", "path": "/user/hive/warehouse/db_name/table_name/dt=${bizdate}", "fieldDelimiter": "\u0001", "column": [ {"name": "id", "type": "string"}, {"name": "name", "type": "string"} ], "fileFormat": "TEXTFILE" } } ``` 上述代码片段展示了如何设置路径以匹配特定日期(`${bizdate}`)下的分区目录,并定义字段分隔符以及列名列表。 #### 3. Writer 插件 (MysqlWriter) 为了将提取出来的数据加载至 MySQL 中,应选用 `mysql` writer 组件。此组件允许用户自定义 SQL 来控制插入行为,比如批量插入或者更新操作[^2]: ```json { "name": "streamwriter", "parameter": { "print": true, "connection": [{ "jdbcUrl": ["jdbc:mysql://localhost:3306/test"], "table": ["target_table"] }], "username":"root", "password":"your_password", "writeMode":"insert", "batchSize":10000, "preSql":[], "postSql":[] } } ``` 这里需要注意的是 `"jdbcUrl"` 应替换为目标数据库的实际连接字符串;同时也要调整用户名密码等相关认证细节。 #### 4. 整合完整的JSON模板 最后一步就是把前面提到的所有要素组合起来形成最终可执行的 job.json 文件: ```json { "job": { "setting": {}, "content": [ { "reader": { ... }, // 如上所示的 hivereader 参数 "writer": { ... } // 如上所示的 mysqlwriter 参数 } ] } } ``` 运行该脚本前,请确认所有依赖环境已经搭建完毕,包括但不限于 Hadoop/HDFS, Hive Metastore 及 Target Database(MySQL)[^1]. ### 注意事项 - 确保 source side(Hive)和 target side(MySQL)之间网络可达。 - 如果遇到性能瓶颈问题,考虑优化 batch size 或者启用并发模式。 - 对于大数据量迁移项目建议先做小规模测试验证流程无误后再扩大范围实施全量转移工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值