我是Cassandra(2.0)和QlikView(11)的新手
我在Cassandra中有两个包含大量数据的键空间(表),我想将它们加载到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并仅从第二个表中收集相应的实体?
我假设您无法在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的最佳答案之外,另一个解决方案是循环使用ID。
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。
答案 0 :(得分:2)
第二个查询失败的原因是因为celery.contrib.rdb
子句期望找到值的文字字符串列表以查看"在"中。例如:
WHERE
第一个查询返回的LOAD
idhost,
site;
SQL SELECT *
FROM Cassandra.test.hosts
WHERE idhost in ('ID1', 'ID2', 'ID3', 'ID4');
字段是QlikView列表,因此无法立即强制转换为字符串。我们必须做更多的脚本来从文字形式的第一个查询中获取值列表,然后将其作为hid
子句的一部分添加到第二个查询中。最简单的方法是将所有WHERE
连接成一个字符串,然后将该字符串用作hid
子句的一部分。
WHERE IN