解决datax写入hdfs到hive查不到数据

datax写入到Hive表的过程中。datax日志显示成功,使用hdfs dfs命令可以查看到文件,但是在Hive中查询数据为空。这种情况可能有以下几个可能的原因和解决方案:

  1. 数据格式不匹配
    • 原因:可能是由于数据格式不匹配导致Hive无法正确解析数据。
    • 解决方案:确保数据文件中的列分隔符与Hive表中定义的字段分隔符一致。在这里,配置中指定了字段分隔符为\t,而Hive表中也使用了相同的字段分隔符,这一点已经满足。
  2. 数据位置不正确
    • 原因:数据文件存储的位置与Hive表的分区定义不匹配。
    • 解决方案:检查数据文件的存储路径是否与Hive表的分区定义一致。
  3. 分区信息未正确加载
    • 原因:Hive可能没有正确加载数据文件所在的分区信息。
    • 解决方案:使用MSCK REPAIR TABLE命令来修复表的分区信息,让Hive重新加载分区信息。
  4. 数据文件权限问题
    • 原因:数据文件的权限设置不正确,导致Hive无法读取数据。
    • 解决方案:确保数据文件对Hive用户具有读取权限,可以通过设置文件权限或者在Hive用户组中添加权限。
  5. 数据写入问题
    • 原因:数据写入到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目录下。

把上面的表修改为非分区表,再次写入时果然有数据了。

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注