如何从 Qlik Sense JSON-RPC API 过滤和提取数据
How to filter and extract data from Qlik Sense JSON-RPC API
我已经能够使用 websockets 成功连接到 Qlik Sense JSON-RPC API (QIX)。而且我能够看到所有 tables、字段和 table 数据。 table 有数百万行,查询所有数据需要数小时。我希望能够按时间戳字段之一进行过滤以仅获取最新数据。
这是我在连接到 wss://{tenant}.us.qlikcloud.com/app/{app_id}
后目前正在进行的 API 次通话
{
"jsonrpc": "2.0",
"id": 1,
"handle": -1,
"method": "OpenDoc",
"params": {
"qDocName": "{app_id}"
}
}
{
"jsonrpc": "2.0",
"id": 1,
"handle": 1,
"method": "GetTablesAndKeys",
"params": {
"qWindowSize": {"qcx": 1, "qcy": 1},
"qNullSize": {"qcx": 1, "qcy": 1},
"qCellHeight": 1,
"qSyntheticMode": true,
"qIncludeSysVars": false,
"qIncludeProfiling": false
}
}
{
"jsonrpc": "2.0",
"id": 1,
"handle": 1,
"method": "GetTableData",
"params": {
"qOffset": 0,
"qRows": 1000,
"qSyntheticMode": true,
"qTableName": "{table_name}"
}
}
如何GetTableData
应用过滤器?
大意是:
- 在必填字段中输入 selection(select 您需要的值)
- 使用必填字段创建超立方体(会话对象)(如果 want/can 并将其用作数据占位符,则可以在 UI 中创建 table)
- “请求”Qlik 向您发送数据。
- 一旦创建了 selection,Qlik 将过滤应用程序中的所有对象(不仅是会话对象)并减少仅与您的 selection 相关的数据。选择是 Qlik 中的核心概念
示例脚本(JavaScript 和 Enigma.js)
const valuesToSelect = [
{
qText: "Value 1",
},
{
qText: "Value 2",
},
];
const global = await session.open();
const app = await global.openDoc("some-app-id");
const field = await app.getField("MyField"); // get the field instance
const selectionResult = await field.selectValues(valuesToSelect); // make selections in the field
// prepare the hypercube properties
// specifying the dimensions we want to be displayed
const hypercubeProps = {
qInfo: {
qType: "my-hypercube",
},
qHyperCubeDef: {
qDimensions: [
{
qDef: { qFieldDefs: ["MyOtherField"] },
},
{
qDef: { qFieldDefs: ["MyYetAnotherField"] },
},
],
qMeasures: [
// Measures can be added to the cube as well. If aggregation is needed
// {
// qDef: { qDef: "=Sum(Value)" },
// },
],
qInitialDataFetch: [
{
qHeight: 5000,
qWidth: 2,
},
],
},
};
const sessionObject = await app.createSessionObject(hypercubeProps); // create our session object
let sessionObjectLayout = await sessionObject.getLayout(); // get its layout. this will populate the data in it
console.log(sessionObjectLayout.qHyperCube.qDataPages); // print the data pages
Hypercubes 在 Qlik 中经常使用并且非常重要。特别是当需要动态创建对象时。超立方体有很多属性,处理起来可能会很麻烦 (IMO)。
资料页
{
qHeight: 5000,
qWidth: 2
}
上面指定了多少cells的数据最初被检索。这些数字不是随机的。 Qlik 允许每个请求返回最多 10 000 单元格 的数据。在我们的示例中,我们要求 Qlik 创建具有 2 个维度的立方体。所以 2 维 * 5000 = 10000 个数据单元格。
这也意味着如果我们有超过 10000 个数据单元格,我们将不得不向 Qlik 询问其余数据。在我们的例子中,我们可以使用 GetHyperCubeData 方法来检索下一个 page/batch 数据(同样最多 10000 cells/data 点)
对数据进行分页可能会很棘手,尤其是当我们必须处理旋转数据时。
列表框对象
只是提一下,在处理单个字段时可能 better/easier 与 ListBox object instead of cubes/tables. Some JS examples can be found here
交互
我已经能够使用 websockets 成功连接到 Qlik Sense JSON-RPC API (QIX)。而且我能够看到所有 tables、字段和 table 数据。 table 有数百万行,查询所有数据需要数小时。我希望能够按时间戳字段之一进行过滤以仅获取最新数据。
这是我在连接到 wss://{tenant}.us.qlikcloud.com/app/{app_id}
{
"jsonrpc": "2.0",
"id": 1,
"handle": -1,
"method": "OpenDoc",
"params": {
"qDocName": "{app_id}"
}
}
{
"jsonrpc": "2.0",
"id": 1,
"handle": 1,
"method": "GetTablesAndKeys",
"params": {
"qWindowSize": {"qcx": 1, "qcy": 1},
"qNullSize": {"qcx": 1, "qcy": 1},
"qCellHeight": 1,
"qSyntheticMode": true,
"qIncludeSysVars": false,
"qIncludeProfiling": false
}
}
{
"jsonrpc": "2.0",
"id": 1,
"handle": 1,
"method": "GetTableData",
"params": {
"qOffset": 0,
"qRows": 1000,
"qSyntheticMode": true,
"qTableName": "{table_name}"
}
}
如何GetTableData
应用过滤器?
大意是:
- 在必填字段中输入 selection(select 您需要的值)
- 使用必填字段创建超立方体(会话对象)(如果 want/can 并将其用作数据占位符,则可以在 UI 中创建 table)
- “请求”Qlik 向您发送数据。
- 一旦创建了 selection,Qlik 将过滤应用程序中的所有对象(不仅是会话对象)并减少仅与您的 selection 相关的数据。选择是 Qlik 中的核心概念
示例脚本(JavaScript 和 Enigma.js)
const valuesToSelect = [
{
qText: "Value 1",
},
{
qText: "Value 2",
},
];
const global = await session.open();
const app = await global.openDoc("some-app-id");
const field = await app.getField("MyField"); // get the field instance
const selectionResult = await field.selectValues(valuesToSelect); // make selections in the field
// prepare the hypercube properties
// specifying the dimensions we want to be displayed
const hypercubeProps = {
qInfo: {
qType: "my-hypercube",
},
qHyperCubeDef: {
qDimensions: [
{
qDef: { qFieldDefs: ["MyOtherField"] },
},
{
qDef: { qFieldDefs: ["MyYetAnotherField"] },
},
],
qMeasures: [
// Measures can be added to the cube as well. If aggregation is needed
// {
// qDef: { qDef: "=Sum(Value)" },
// },
],
qInitialDataFetch: [
{
qHeight: 5000,
qWidth: 2,
},
],
},
};
const sessionObject = await app.createSessionObject(hypercubeProps); // create our session object
let sessionObjectLayout = await sessionObject.getLayout(); // get its layout. this will populate the data in it
console.log(sessionObjectLayout.qHyperCube.qDataPages); // print the data pages
Hypercubes 在 Qlik 中经常使用并且非常重要。特别是当需要动态创建对象时。超立方体有很多属性,处理起来可能会很麻烦 (IMO)。
资料页
{
qHeight: 5000,
qWidth: 2
}
上面指定了多少cells的数据最初被检索。这些数字不是随机的。 Qlik 允许每个请求返回最多 10 000 单元格 的数据。在我们的示例中,我们要求 Qlik 创建具有 2 个维度的立方体。所以 2 维 * 5000 = 10000 个数据单元格。 这也意味着如果我们有超过 10000 个数据单元格,我们将不得不向 Qlik 询问其余数据。在我们的例子中,我们可以使用 GetHyperCubeData 方法来检索下一个 page/batch 数据(同样最多 10000 cells/data 点)
对数据进行分页可能会很棘手,尤其是当我们必须处理旋转数据时。
列表框对象
只是提一下,在处理单个字段时可能 better/easier 与 ListBox object instead of cubes/tables. Some JS examples can be found here
交互