datax写入到Hive表的过程中。datax日志显示成功,使用hdfs dfs
命令可以查看到文件,但是在Hive中查询数据为空。这种情况可能有以下几个可能的原因和解决方案:
- 数据格式不匹配:
- 原因:可能是由于数据格式不匹配导致Hive无法正确解析数据。
- 解决方案:确保数据文件中的列分隔符与Hive表中定义的字段分隔符一致。在这里,配置中指定了字段分隔符为
\t
,而Hive表中也使用了相同的字段分隔符,这一点已经满足。
- 数据位置不正确:
- 原因:数据文件存储的位置与Hive表的分区定义不匹配。
- 解决方案:检查数据文件的存储路径是否与Hive表的分区定义一致。
- 分区信息未正确加载:
- 原因:Hive可能没有正确加载数据文件所在的分区信息。
- 解决方案:使用
MSCK REPAIR TABLE
命令来修复表的分区信息,让Hive重新加载分区信息。
- 数据文件权限问题:
- 原因:数据文件的权限设置不正确,导致Hive无法读取数据。
- 解决方案:确保数据文件对Hive用户具有读取权限,可以通过设置文件权限或者在Hive用户组中添加权限。
- 数据写入问题:
- 原因:数据写入到Hive表时出现了错误,导致数据并未正确写入。
- 解决方案:检查DataX任务的日志,确认数据是否成功写入到Hive表中。如果写入失败,根据错误信息进行排查并修复。
datax的json配置如下:
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS":"hdfs://nameservice1",
"hadoopConfig":{
"dfs.nameservices": "nameservice1",
"dfs.ha.namenodes.nameservice1": "namenode1,namenode2",
"dfs.namenode.rpc-address.nameservice1.namenode1": "cdh01:8020",
"dfs.namenode.rpc-address.nameservice1.namenode2": "cdh09:8020",
"dfs.client.failover.proxy.provider.nameservice1": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
},
"fileType": "text",
"path": "/user/hive/warehouse/test.db/tb_test",
"fileName": "result",
"column": [
{
"name": "pid",
"type": "STRING"
},
{
"name": "dqf",
"type": "STRING"
},
{
"name": "ptime",
"type": "STRING"
},
{
"name": "pvalue",
"type": "STRING"
},
{
"name": "ds",
"type": "STRING"
}
],
"writeMode": "truncate",
"fieldDelimiter": "\t"
}
}
}
在hive表结构如下:
CREATE TABLE IF NOT EXISTS test.tb_test (
pid STRING COMMENT '点号ID',
dqf STRING COMMENT '数据质量码',
ptime BIGINT COMMENT '时间',
pvalue STRING COMMENT '数据值'
) COMMENT '昨日Po|rlfq数据历史表'
partitioned by (ds string COMMENT '日期')
row format delimited
fields terminated by "\t"
STORED AS TEXTFILE;
在这里,数据文件的存储路径为/user/hive/warehouse/test.db/tb_test
,而Hive表定义的分区为partitioned by (ds string COMMENT '日期')
,需要确认数据文件是否存储在/user/hive/warehouse/test.db/
tb_test/ds=xxxx
目录下。
把上面的表修改为非分区表,再次写入时果然有数据了。