Datax读取Hive数据写入到Mysql,并传递日期参数
Hive数据的导入导出,一直是在大数据离线批处理任务中必要的操作。不过之前使用Sqoop的可能要占大多数,而在近些年,阿里开源了一款数据导入导出的工具,也就是Datax。Datax是基于python以及json配置文件,对指定的数据进行导入导出,可以指定多种数据源和数据目的地,使用起来也是非常方便。
下面将以一个例子来介绍一下Datax读取Hive数据写入Mysql的配置以及流程:
Datax json配置文件
{
"job": {
"setting": {
"speed": {
"channel": 1
}
},
"content": [
{
"reader": {
"name": "hdfsreader",
"parameter": {
// 读取hive数据的地址,也就是hdfs存储文件的地址,${day},是外部执行命令传入的日期
"path": "/user/hive/warehouse/test.db/device_orc/time=${day}",
"defaultFS": "hdfs://bigdata01:9000",
// 下面是hive中具体的字段索引以及类型,也可以自定义value的输出,比如像下面的时间
"column": [
{
"index": 0,
"type": "string"
},
{
"index": 1,
"type": "string"
},
{
"index": 2,
"type": "long"
},
{
"type": "string",
"value": "${day}"
}
],
// 这里是hdfs存储数据的分隔符
"fieldDelimiter":",",
// 文件类型,默认是text类型
"fileType": "orc"
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "root",
"password" : "ddbes2020",
"column" : [
"company_id",
"device_mark",
"num",
"day"
],"session" : [
"set session sql_mode=ANSI"
],"preSql" : [
// 预处理sql,可以在每次执行前,先做一次清理,防止数据的重复写入,导致冗余
"delete from device_data where day='${day}'"
],"connection":[
{
"jdbcUrl" : "jdbc:mysql://bigdata01:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true",
"table":[
"device_data"
]
}
]
}
}
}
]
}
}
Datax job执行命令
python ../bin/datax.py test.json -p -Dday=(date -d 'yesterday' "+%Y-%m-%d")
通过-p来进行传入参数的指定,-D是规范写法,day是需要传入的参数名称,和json文件中${day}相对应,后面的参数取的是昨天的日期,如:2020-07-19。这样每次导出的数据都是昨天数据计算的结果,可以通过crontab做定时任务,也可以使用oozie去做定时任务。