使用 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);
我是 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);