spark行转列和row_number分组排序用法记录
> 年纪大了,不记下来容易忘记 ### 1. spark行转列 spark行转列主要就是 `pivot` 和 `agg` 这两个方法的使用,其他的都是非常普通的逻辑。 如下所示就是对 "axxId", "cxxId", "dxxId", "exxId", "fxxd" 这几个字段进行group分组。 然后将结果的eventType字段进行行转列,意味着每一个eventType的值都会作为列。 对于可能出现多个值的flag字段:进行逗号拼接成一个叫flag的字段; 对于可能出现多个值的orderId字段:进行逗号拼接成一个叫allOrderId的字段; 对于可能出现多个值的time字段:取最大的time值。 ``` ** * 对xx信息进行行转列,将不同的eventType转为列 */ private Dataset<Row> findPivotEventSourceDataset(Dataset<EventSource> eventSourceDataset) { return eventSourceDataset .groupBy("axxId", "...

2023-11-28 15:27

类型:工作 标签:spark,行转列,row_number

javah生成jni文件问题
jdk8中的 `javac -h` 可以代替 `javah` 的功能。 `javah` 在jdk9中被设置为不推荐使用, `javah` 在jdk10中被移除。 假设当前目录已经写好了Hello的java类,当前目录有文件名为: Hello.java 内容为: ``` package com.xxx; public class Test2 { static{ String path = "/tmp/test2.so"; // 本地库的绝对路径或者相对路径 System.load(path); // 加载本地库 } public native String print(String msg); } ``` 原javah的使用方式: ``` javah Hello ``` 现在 javac -h 的使用方式: ``` javac -h ./ Hello.java ``` 会在当前目录生成一个文件: com_xxx_Test2.h

2023-10-31 13:06

类型:工作 标签:javah,javac,jni

使用java部署模型训练文件
> 最近ai比较火,有些业务会涉及到调用模型来得到结果,这就会涉及到模型的部署,最常见的是python环境,使用TensorFlow的docker镜像来得到一个模型部署服务。 我们这里讨论的是怎么用java来实现一个最简化的模型部署服务,甚至是用java自建一个多元化的模型部署服务集群(have a joke)。 ### PMML 这里讨论常见的PMML模型文件和ONNX模型文件,训练完模型后,会使用特定的工具将模型导出为PMML格式或者ONNX格式。 PMML(Predictive Model Markup Language)是一种XML-based的语言,用于表示和共享数据挖掘和统计模型。 PMML文件包含了模型的所有信息,包括模型参数、输入输出变量、数据处理转换等,因此可以在不同的软件和平台上使用。 PMML文件具有较好的可读性和可解释性,也支持多种类型的模型,包括分类、回归、聚类、时间序列等。 ### ONNX ONNX(Open Neural Network Exchange)是一种用于表示深度学习模型的开放格式,旨在使不同的深度学习框架能够共享和交换模型。ONNX文件包含了模型的结构...

2023-10-24 23:20

类型:工作 标签:PMML,ONNX,AI,JAVA,TensorFlow

RedisTemplate 使用 setIfAbsent 做分布式锁出现返回值为 null 的问题
> 问题背景:在实现一个分布式锁的时候经常会使用redis来做,而java的spring项目较常见的就是使用`RedisTemplate`来操作redis,使用 `redisTemplate.opsForValue().setIfAbsent()`来做一个分布式锁,但是在获取锁的时候,不管什么情况返回值都是null,使得不确定是否获得了锁。 这是某项目A从不知名地方拷贝过来的获取锁的代码: ``` public boolean lock(String lockKey, String lockValue){ return Boolean.TRUE.equals(stringRedisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, Duration.ofSeconds(LOCK_EXPIRE_SECONDS))); } ``` 这代码这么看是没有什么大问题的,`setIfAbsent`,如果key不存在则设置值并且返回true,如果key存在则不设置值并且返回false。 实际上项目A运行起来的时候发现不管怎么调用`lock`...

2022-10-27 13:57

类型:工作 标签:spring,RedisTemplate

循环逻辑导致容器负载过高持续扩容问题排查
某应用在测试环境部署上联调出现扩容,且扩容节点数一直在增长,新扩容的节点也全部都是CPU暴涨。 ![](https://cdn.yuxianghe.net/image/blog/87-1.png) 1. 随机登录了其中一个节点查看CPU情况 `top` ![](https://cdn.yuxianghe.net/image/blog/87-2.png) 2.根据直觉判断是java应用新上了某个测试功能导致了cpu占用最高,查看所在java应用的进程的线程情况.(图片来自随机截图,与实际数据不一样,这里可以假设还原当时的场景,前面几个线程id都是3507) `top -Hp 2864839` ![](https://cdn.yuxianghe.net/image/blog/87-3.png) 3.可以看到前几个占用CPU最高的线程情况,占用最高的前三个都是30%+,且都是id为`3507`的线程(图片来自随机截图,与实际数据不一样,这里可以假设还原当时的场景,前面几个线程id都是3507),可以猜测这个线程在执行一个大循环需要一直计算的逻辑。 这个时候快速的将java的线程...

2022-08-25 12:43

类型:工作 标签:jstack,java

我与我周旋久 独孤影