IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Impala推送数据到Redis及String.valueOf()生产问题踩坑 -> 正文阅读

[大数据]Impala推送数据到Redis及String.valueOf()生产问题踩坑

背景

Impala数据推送到Redis,平台业务使用方反馈插入到Redis的数据不对:
在这里插入图片描述
Redis插入key没有问题;value是0.6nul有问题,正常的数据应该是0.6

问题排查

代码片段如下:

private void pushToRedis(Map query, List<Map<String, Object>> datalist) {
	JedisCluster redisCluster = this.getConnection();
    String[] columnArr = (query.get(COLUMN) + "").replace("\n", "").replace(" ", "").split(",");
    String keyTo = String.valueOf(query.get("keyTo"));
    String valueSplit = String.valueOf(query.get("valueSplit"));
    if (StringUtils.isEmpty(valueSplit)) {
        // 默认分隔符
        valueSplit = ",";
    }
    Object redisExpireObj = query.get("redisExpire");
    SetParams setParams;
    if (StringUtil.isNotNullOrEmpty(redisExpireObj)) {
        setParams = SetParams.setParams().ex(Integer.parseInt(redisExpireObj + ""));
    } else {
        setParams = SetParams.setParams();
    }
    for (Map<String, Object> item : datalist) {
        StringBuilder sb = new StringBuilder();
        for (String s : columnArr) {
            sb.append(item.get(s)).append(valueSplit);
        }
        String objectKey = String.valueOf(item.get(keyTo));
        redisCluster.set(objectKey, sb.substring(0, sb.toString().length() - 1), setParams);
    }
}

datalist是Impala里面查询得到的数据。其结果来自于如下SQL语句:

select concat('fqz_appscore_list_yxd:', cast(appname AS string) ) as keyname, appscore from fqz.Yxd_AppScore_List;

执行SQL,获取得到的数据,无论是key,还是value都是正常的。value没有带多余的nul

说明数据源是正常的。

问题出现在推送到Redis的逻辑代码处,即上面的Java代码。

而key是没有问题,只要value有问题,最终落值的value为:sb.substring(0, sb.toString().length() - 1

中间赋值的地方为:sb.append(item.get(s)).append(valueSplit);

说明,问题在于这个valueSplit。再看下数据库原始数据,即Map query这个map。

{
    "redisExpire": "172800",
    "column": "appscore",
    "keyTo": "keyname"
  }

并没有valueSplit这个字段,query.get("valueSplit")的结果为null,好家伙!!

再看下String.valueOf()源码:

/**
 * Returns the string representation of the {@code Object} argument.
 */
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

问题定位到。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:34:18  更:2022-03-08 22:34:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:45:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码