使用 DataSatx ODBC 在 QlikView 中从 Cassandra 加载连接表

Load connecting tables from Cassandra in QlikView with DataSatx ODBC

我是 Cassandra (2.0) 和 QlikView (11) 的新手。
我在 Cassandra 中有两个包含大量数据的键空间 (tables),我想将它们加载到 QlikView。
由于我无法加载整个集合,因此需要进行过滤。

// In QlikView's edit script
ODBC CONNECT TO [DataStax Cassandra ODBC DSN64];
LOAD idsession,
logintime,
"h_id" as hid;
SQL SELECT *
FROM Cassandra.test.sessions
WHERE logintime > '2015-06-09'
ALLOW FILTERING;

LOAD idhost,
site;
SQL SELECT *
FROM Cassandra.test.hosts
WHERE idhost in hid;

第二个查询不起作用,来自 qlikview 行的错误 3:16 输入 'hid' 没有可行的替代方案。

我的问题:是否可以从第一个查询中获取 h_ids 并仅从第二个 table 中收集相应的实体?

我假设您不能在 DataSyntax ODBC 中执行 Exists,这可能会有所帮助。 DataStax doc

这可以通过 (C#) 等外部程序完成,但我真的想在 QlikView 的脚本文件中完成:

// Not complete code
query = select * from sessions where loginTime > '2015-06-09';  
foreach (var id in query) {
query2 = "select * from hosts where idhost = " + i;
}

编辑
这可以在加载XML个文件时解决:

TableA:
LOAD id, 
 itema
FROM
[C:\test1data.xlsx]
(ooxml, embedded labels);

TableB:
LOAD idb, 
 itemb,
 ida
FROM
[C:\test2data.xlsx]
(ooxml, embedded labels) where(Exists (id,ida)); 

EDIT2
除了来自@i_saw_drones 的出色答案之外,另一个解决方案是遍历 ids.

For i = 1 to NoOfRows('Sessions')
 Let cur_id = Peek('hid',i - 1,'Sessions');
 LOAD 
  idhost,
  site;
  SQL SELECT *
  FROM Cassandra.test.hosts
  WHERE idhost = $(cur_id);
NEXT i

然而,表现并不出色。从 Cassandra 加载大约 300 K 行大约需要 30 分钟。使用连接器在 C# 程序中测试了相同的查询,耗时 9 秒。但这只是查询。然后你应该把它写到 XML 然后加载到 QlikView.

第二个查询失败的原因是因为 WHERE 子句期望找到值的文字字符串列表以查找 "in"。例如:

LOAD 
    idhost,
    site;
SQL SELECT *
FROM Cassandra.test.hosts
WHERE idhost in ('ID1', 'ID2', 'ID3', 'ID4');

第一个查询返回的 hid 字段是 QlikView 列表,因此不能立即强制转换为字符串。我们必须做更多的脚本来从第一个查询中以文字形式获取值列表,然后将其作为 WHERE 子句的一部分添加到第二个查询中。最简单的方法是将所有 hid 连接成一个字符串,然后将该字符串用作 WHERE IN 子句的一部分。

ODBC CONNECT TO [DataStax Cassandra ODBC DSN64];

MyData:
LOAD
    idsession,
    logintime,
    "h_id" as hid;
SQL SELECT *
FROM Cassandra.test.sessions
WHERE logintime > '2015-06-09'
ALLOW FILTERING;

hid_entries:
LOAD
    chr(39) & hids & chr(39) as hids;
LOAD
    concat(hid, chr(39) & ',' & chr(39)) as hids;
LOAD DISTINCT
    hid
RESIDENT MyData;

LET hid_values = '(' & peek('hids',0,'hid_entries') & ')';

DROP TABLE hid_entries;

LOAD 
    idhost,
    site;
SQL SELECT *
FROM Cassandra.test.hosts
WHERE idhost in $(hid_values);