用Java在PostgreSQL上编程生成OLAP多维数据集
有没有办法用PostgreSQL和Java实现以下行为: 假设您有两张桌子:用Java在PostgreSQL上编程生成OLAP多维数据集,java,postgresql,analytics,olap-cube,Java,Postgresql,Analytics,Olap Cube,有没有办法用PostgreSQL和Java实现以下行为: 假设您有两张桌子: 交易和用户事务保存一些事务数据,而用户显然保存用户数据。 这两个表可以在Users.ID==Transactions.UserID条件下联接 由于该联接表中的列很少,所以我想进行一些分析 例如,我想知道每个用户完成了多少事务。很自然,你会这样写: SELECT UserID, COUNT(DISTINCT TransactionID) FROM Users NATURAL JOIN Transactions GROUP
交易
和用户
<代码>事务保存一些事务数据,而用户
显然保存用户数据。这两个表可以在
Users.ID==Transactions.UserID
条件下联接
由于该联接表中的列很少,所以我想进行一些分析
例如,我想知道每个用户完成了多少事务。很自然,你会这样写:
SELECT UserID, COUNT(DISTINCT TransactionID)
FROM Users NATURAL JOIN Transactions
GROUP BY UserID;
不过,我们也可以说,我想获得一些关于每种货币交易的信息
SELECT Currency, COUNT(DISTINCT TransactionID)
FROM Users NATURAL JOIN Transactions
GROUP BY Currency;
或者每个用户使用每种货币支付了多少次:
SELECT UserID, Currency, COUNT(DISTINCT TransactionsID) AS NumTransactions
FROM Users NATURAL JOIN Transactions
GROUP BY UserID, Currency;
但是现在,考虑到最后一条SQL,我可以实现前面两条SQL中的任意一条:
首先,我根据前面的SQL创建一个表:
CREATE TABLE PerUserCurrencyStats AS
SELECT UserID, Currency, COUNT(DISTINCT TransactionsID) AS NumTransactions, SUM(Amount) AS TotalAmount
FROM Users NATURAL JOIN Transactions
GROUP BY UserID, Currency;
然后,我降低维度,将需要求和的求和:
CREATE TABLE PerUserTransactionCount AS
SELECT UserID, SUM(NumTransactions)
FROM PerUserCurrencyStats
GROUP BY UserID;
好的,那么问题在哪里呢?嗯,在我看来,这真的很像OLAP多维数据集(请注意,我希望对其他列/维度进行分析)
由于我仅限于使用PostgreSQL并动态生成这样的表,我想知道在我的Java代码中,是否有办法通过调用SQL命令来实现这一点,但不必自己编写所有这些繁琐的代码?编写所有这些SQL代码可能有点繁琐。正如您提到的Olap多维数据集,我建议您使用mondrian 您可以使用在java代码中嵌入molap引擎 您必须在java代码中使用的模式文件中描述多维数据集、维度和度量 代码片段
package project1;
import java.io.PrintWriter;
import mondrian.olap.Connection;
import mondrian.olap.DriverManager;
import mondrian.olap.Query;
import mondrian.olap.Result;
public class imondrian {
public static void main(String[] args) {
String connectString = "Provider=mondrian;"
+ "Jdbc=jdbc:mysql://localhost:3306/foodmart?user=foodmart&password=foodmart;"
+ "Catalog=file:/path/to/file/FoodMart.xml;"
+ "JdbcDrivers=com.mysql.jdbc.Driver";
System.out.println(connectString);
Connection connection = null;
connection = DriverManager.getConnection(connectString, null, false);
Query query = connection.parseQuery(
"SELECT {[Measures].[Unit Sales], [Measures].[Store Cost], [Measures].[Store Sales]} on columns,"
+ "{([Promotion Media].[All Media], [Product].[All Products])} ON rows "
+ "FROM Sales "
+ "WHERE ([Time].[1997])"
);
Result result = connection.execute(query);
result.print(new PrintWriter(System.out,true));
}
}
编写所有这些sql代码可能有点乏味。正如您提到的Olap多维数据集,我建议您使用mondrian 您可以使用在java代码中嵌入molap引擎 您必须在java代码中使用的模式文件中描述多维数据集、维度和度量 代码片段
package project1;
import java.io.PrintWriter;
import mondrian.olap.Connection;
import mondrian.olap.DriverManager;
import mondrian.olap.Query;
import mondrian.olap.Result;
public class imondrian {
public static void main(String[] args) {
String connectString = "Provider=mondrian;"
+ "Jdbc=jdbc:mysql://localhost:3306/foodmart?user=foodmart&password=foodmart;"
+ "Catalog=file:/path/to/file/FoodMart.xml;"
+ "JdbcDrivers=com.mysql.jdbc.Driver";
System.out.println(connectString);
Connection connection = null;
connection = DriverManager.getConnection(connectString, null, false);
Query query = connection.parseQuery(
"SELECT {[Measures].[Unit Sales], [Measures].[Store Cost], [Measures].[Store Sales]} on columns,"
+ "{([Promotion Media].[All Media], [Product].[All Products])} ON rows "
+ "FROM Sales "
+ "WHERE ([Time].[1997])"
);
Result result = connection.execute(query);
result.print(new PrintWriter(System.out,true));
}
}
编写所有这些sql代码可能有点乏味。正如您提到的Olap多维数据集,我建议您使用mondrian 您可以使用在java代码中嵌入molap引擎 您必须在java代码中使用的模式文件中描述多维数据集、维度和度量 代码片段
package project1;
import java.io.PrintWriter;
import mondrian.olap.Connection;
import mondrian.olap.DriverManager;
import mondrian.olap.Query;
import mondrian.olap.Result;
public class imondrian {
public static void main(String[] args) {
String connectString = "Provider=mondrian;"
+ "Jdbc=jdbc:mysql://localhost:3306/foodmart?user=foodmart&password=foodmart;"
+ "Catalog=file:/path/to/file/FoodMart.xml;"
+ "JdbcDrivers=com.mysql.jdbc.Driver";
System.out.println(connectString);
Connection connection = null;
connection = DriverManager.getConnection(connectString, null, false);
Query query = connection.parseQuery(
"SELECT {[Measures].[Unit Sales], [Measures].[Store Cost], [Measures].[Store Sales]} on columns,"
+ "{([Promotion Media].[All Media], [Product].[All Products])} ON rows "
+ "FROM Sales "
+ "WHERE ([Time].[1997])"
);
Result result = connection.execute(query);
result.print(new PrintWriter(System.out,true));
}
}
编写所有这些sql代码可能有点乏味。正如您提到的Olap多维数据集,我建议您使用mondrian 您可以使用在java代码中嵌入molap引擎 您必须在java代码中使用的模式文件中描述多维数据集、维度和度量 代码片段
package project1;
import java.io.PrintWriter;
import mondrian.olap.Connection;
import mondrian.olap.DriverManager;
import mondrian.olap.Query;
import mondrian.olap.Result;
public class imondrian {
public static void main(String[] args) {
String connectString = "Provider=mondrian;"
+ "Jdbc=jdbc:mysql://localhost:3306/foodmart?user=foodmart&password=foodmart;"
+ "Catalog=file:/path/to/file/FoodMart.xml;"
+ "JdbcDrivers=com.mysql.jdbc.Driver";
System.out.println(connectString);
Connection connection = null;
connection = DriverManager.getConnection(connectString, null, false);
Query query = connection.parseQuery(
"SELECT {[Measures].[Unit Sales], [Measures].[Store Cost], [Measures].[Store Sales]} on columns,"
+ "{([Promotion Media].[All Media], [Product].[All Products])} ON rows "
+ "FROM Sales "
+ "WHERE ([Time].[1997])"
);
Result result = connection.execute(query);
result.print(new PrintWriter(System.out,true));
}
}
谢谢你,布鲁诺。我会试试看它是否适合我的需要。同时,这是一个向上的投票:谢谢你,布鲁诺。我会试试看它是否适合我的需要。同时,这是一个向上的投票:谢谢你,布鲁诺。我会试试看它是否适合我的需要。同时,这是一个向上的投票:谢谢你,布鲁诺。我会试试看它是否适合我的需要。同时,这是一个向上的投票:D