如何解决Cassandra 选择 CQL:无法在通配符后添加列
我需要将写入时间戳作为许多表的表导出的一部分输出,尽管我无法找到一种不强制我明确选择语句中所有列的方法。
而不是能够做到这一点:
SELECT *,writetime(data) AS timestamp FROM dls.licenses;
我必须这样做:
SELECT column1,column2,...,writetime(data) AS timestamp FROM dls.licenses;
这很不方便,因为这意味着每次任何表的架构发生变化时我都必须更改导出工具。
有更好的方法吗?
编辑:为了澄清,我得到的实际错误如下。错误中的语法呈现方式可以认为 SQL 应该没问题:
SELECT *,writetime(id) AS timestamp FROM dls.licenses;
SyntaxException: line 1:8 mismatched input ',' expecting K_FROM (SELECT *[,]...)
编辑 2:这是用于该表的键空间和创建语句:
CREATE KEYSPACE IF NOT EXISTS dls WITH replication = { 'class': 'SimpleStrategy','replication_factor': ‚1‘ };
CREATE TABLE IF NOT EXISTS dls.licenses (subscription_id text,id text,key text,data text,PRIMARY KEY (key));
CREATE INDEX IF NOT EXISTS ON dls.licenses (id);
顺便说一句:我使用的是新的 Cassandra 4.0.0 (GA)。
解决方法
WHERE 子句指定必须查询哪些行。它由作为 PRIMARY KEY 一部分和/或在其上定义了二级索引的列上的关系组成。
- 关系的列规范必须是以下之一:
- 表的分区键的一个或多个成员
- 聚簇列,仅当该关系前面是指定分区键中所有列的其他关系
- 使用 CREATE INDEX 编制索引的列。
在 Cassandra 3.6 及更高版本中,添加 ALLOW FILTERING 以仅过滤非索引簇列。
您可以通过在您想要写入时间的列上创建二级索引来解决您的查询问题。请记住,二级索引会产生开销,并可能导致意想不到的后果。
,如果您要导出为 CSV 或 JSON 文件,您可以考虑使用 DataStax 的 dsbulk。
https://github.com/datastax/dsbulk
最新版本的 dsbulk 1.8.0 增加了对导出 writetime 和 ttl 的支持。
dsbulk unload -url myData.csv -k ks1 -t table1 --timestamp
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。