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

时间:2015-05-22 11:10:14

标签: cassandra datastax qlikview

我是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。

1 个答案:

答案 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