如何从 Qlik Sense JSON-RPC API 过滤和提取数据

问题描述 投票:0回答:2

我已成功使用 websockets 连接到 Qlik Sense JSON-RPC API (QIX)。我可以看到所有的表、字段和表数据。这些表有数百万行,查询所有数据需要几个小时。我希望能够按时间戳字段之一进行过滤以仅获取最新数据。

以下是我当前在连接到

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
应用过滤器?

qliksense
2个回答
4
投票

总体思路是:

  • 在必填字段中进行选择(选择您需要的值)
  • 创建具有必填字段的超立方体(会话对象)(如果您愿意/可以,您可以在 UI 中创建表并将其用作数据占位符)
  • “要求”Qlik 向您发送数据。
  • 一旦做出选择,Qlik 将过滤应用程序中的所有对象(不仅是会话对象)并减少仅与您的选择相关的数据。选择是 Qlik 的核心概念

示例脚本(带有 Enigma.js 的 JavaScript)

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 个cells 数据。在我们的示例中,我们要求 Qlik 创建二维立方体。因此 2 维 * 5000 = 10000 个数据单元。 这也意味着,如果我们有超过 10000 个数据单元格,我们将不得不向 Qlik 询问其余数据。在我们的例子中,我们可以使用 GetHyperCubeData 方法来检索下一页/批次数据(同样最多 10000 个单元格/数据点)

对数据进行分页可能很棘手,尤其是当我们必须处理数据透视数据时。

列表框对象

仅提一下,在处理单个字段时,与 ListBox 对象而不是多维数据集/表格交互可能会更好/更容易。一些 JS 示例可以在这里找到


0
投票

我有一系列博客文章介绍了引擎 API 的基础知识,这可能有助于提供一些背景信息:

https://community.qlik.com/t5/Design/Dissecting-the-Engine-API-Part-5-Multiple-Hypercube-Dimensions/ba-p/1841618

它包括如何执行选择并从超立方体获取数据。

关于“GetTableData”方法:它仅用于数据预览,而不是获取所有数据,并且该方法不受选择状态的影响。因此,如果您想要这种过滤或者您的表很大,那么您应该依赖于 Stefan Stoichev 在之前的评论中描述的流程类型。

© www.soinside.com 2019 - 2024. All rights reserved.