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
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
使用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
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
循环逻辑导致容器负载过高持续扩容问题排查
某应用在测试环境部署上联调出现扩容,且扩容节点数一直在增长,新扩容的节点也全部都是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