Finology 大数据金融

通过大数据以量化金融

我们在使用官方提供的GlusterFS Java API,可能会遇到很多坑。

1
2
3
4
5
6
7
8
9
Exception in thread "main" java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no libgfapi-jni64-1.0.5-SNAPSHOT in java.library.path, no libgfapi-jni-1.0.5-SNAPSHOT in java.library.path, no libgfapi-jni in java.library.path, /tmp/liblibgfapi-jni-64-1-5094135110056410243.0: libgfapi.so.0: cannot open shared object file: No such file or directory]
at org.fusesource.hawtjni.runtime.Library.doLoad(Library.java:182)
at org.fusesource.hawtjni.runtime.Library.load(Library.java:140)
at com.peircean.libgfapi_jni.internal.GLFS.<clinit>(GLFS.java:52)
at com.peircean.glusterfs.GlusterFileSystemProvider.glfsNew(GlusterFileSystemProvider.java:70)
at com.peircean.glusterfs.GlusterFileSystemProvider.newFileSystem(GlusterFileSystemProvider.java:43)
at com.peircean.glusterfs.GlusterFileSystemProvider.getPath(GlusterFileSystemProvider.java:111)
at java.nio.file.Paths.get(Paths.java:143)
at com.peircean.glusterfs.example.Example.main(Example.java:43)

有时候需要在程序里面做分组操作,类似MySQL中的group by语句。

比如有如下数据:

id name
1 A
1 B
2 C

我们想把它分组成这样的形式:{1=[A, B], 2=[C]}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class GroupingByDemo {

@Data
static class IdNamePair {
private int id;
private String name;
}

public static void main(String[] args) {

IdNamePair pair = new IdNamePair();
pair.id = 1;
pair.name = "A";

IdNamePair pair2 = new IdNamePair();
pair2.id = 1;
pair2.name = "B";

IdNamePair pair3 = new IdNamePair();
pair3.id = 2;
pair3.name = "C";

List<IdNamePair> list = new ArrayList<>();
list.add(pair);
list.add(pair2);
list.add(pair3);

Map<Integer, List<String>> map = list.stream()
.collect(Collectors.groupingBy(IdNamePair::getId,
Collectors.mapping(IdNamePair::getName, Collectors.toList())));

System.out.println(map);
}
}

Collectors.mapping(IdNamePair::getName, Collectors.toList()) 相当于再往里面拨一层,取对象里面的一个属性。

在应用中,很多会用到数据库的存储过程,一般都会在程序里面实现数据库的逻辑。

但有时候要快速的获取某个值,逻辑比较复杂的时候,可能会用到存储过程。

比如接下来的案例,会把数据库的表作为一个变量传入。

1
2
3
4
5
6
7
8
9
10
11
12
13
DROP PROCEDURE IF EXISTS getInfo;
DELIMITER $$
CREATE PROCEDURE getInfo(IN tableName VARCHAR(100), IN id INT, OUT name VARCHAR(100))
BEGIN

SET @stmt := CONCAT("SELECT name INTO @var FROM ", tableName, " WHERE id = ", id);
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET name := @var;
END$$
DELIMITER ;

当创建好存储过程以后,可以通过以下方式调用。

1
2
3
SET @tableName := "tb_user";
CALL getInfo(@tableName, 4, @name);
SELECT @name;

如果不写存储过程,还可以通过执行下面代码的方式获取结果。

1
2
3
SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;
1
SET @group = (SELECT `group` FROM user WHERE user = @user);

或者

1
SELECT `group` INTO @group FROM user WHERE user = @user;
0%