【问题标题】:Query from secondary index on aerospike从 aerospike 上的二级索引查询
【发布时间】:2018-03-23 19:26:03
【问题描述】:

我正在为我们的一个项目考虑使用 aerospike。所以我目前创建了一个 3 节点集群并在上面加载了一些数据。

样本数据

ns: imei

设置:imei_data

+-------------------+-----------------------+-----------------------+----------------------------+--------------+--------------+
| imsi              | fcheck                | lcheck                | msc                        | fcheck_epoch | lcheck_epoch |
+-------------------+-----------------------+-----------------------+----------------------------+--------------+--------------+
| "413010324064956" | "2017-03-01 14:30:26" | "2017-03-01 14:35:30" | "13d20b080011044917004100" | 1488358826   | 1488359130   |
| "413012628090023" | "2016-09-21 10:06:49" | "2017-09-16 13:54:40" | "13dc0b080011044917006100" | 1474432609   | 1505550280   |
| "413010130130320" | "2016-12-29 22:05:07" | "2017-10-09 16:17:10" | "13d20b080011044917003100" | 1483029307   | 1507546030   |
| "413011330114274" | "2016-09-06 01:48:06" | "2017-10-09 11:53:41" | "13d20b080011044917003100" | 1473106686   | 1507530221   |
| "413012629781993" | "2017-08-16 16:03:01" | "2017-09-13 18:10:48" | "13dc0b080011044917004100" | 1502879581   | 1505306448   |

然后我使用 AQL 在 lcheck_epoch 上创建了一个二级索引,因为我想根据日期进行查询。

create index idx_lcheck on imei.imei_data (lcheck_epoch) NUMERIC

+--------+----------------+-----------+-------------+-------+--------------+----------------+-----------+
| ns     | bin            | indextype | set         | state | indexname    | path           | type      |
+--------+----------------+-----------+-------------+-------+--------------+----------------+-----------+
| "imei" | "lcheck_epoch" | "NONE"    | "imei_data" | "RW"  | "idx_lcheck" | "lcheck_epoch" | "NUMERIC" |
+--------+----------------+-----------+-------------+-------+--------------+----------------+-----------+

当我执行时

select imsi from imei.imei_data where idx_lcheck=1476165806

我来了

Error: (204) AEROSPIKE_ERR_INDEX

请解释一下。

【问题讨论】:

    标签: aerospike aql secondary-indexes


    【解决方案1】:

    您在查询中使用的是索引名称,而不是 bin 名称。试试这个:

    SELECT imsi FROM imei.imei_data WHERE lcheck_epoch=1476165806
    

    或者

    SELECT imsi FROM imei.imei_data WHERE lcheck_epoch BETWEEN 1490000000 AND 1510000000
    

    请注意,您可以通过多种语言客户端(Java、C、C#、Go)使用predicate filtering 进行更复杂的查询。例如 Java 客户端的PredExp 类(参见examples。)

    【讨论】:

    • 非常感谢。起初,当我执行 SELECT imsi FROM imei.imei_data WHERE lcheck_epoch='1476165806';它给了我错误:(201)AEROSPIKE_ERR_INDEX_NOT_FOUND。应该是因为我用了引号。
    • 只是两个侧面问题。 1) aerospike 是否与 mysql 等效:从 imei 选择 field1, field2 到 out 文件 '/tmp/file' 其中 lcheck_epoch>1476165806 因为我必须将每日更新记录的 csv 转储发送到另一个系统。在上面的问题中 lcheck_epoch>1476165806 是一个有效的过滤器吗?
    • 是的,引号会将其转换为字符串,并且您在该 bin 上没有用于 STRING 数据的二级索引,您的索引是 NUMERIC。没有自动类型转换。
    • 关于 CSV 转储,这里有一个类似的问题:stackoverflow.com/questions/45819023/… - 简而言之,我建议您使用 asbackup 和 asrestore,这将更快,生成更紧凑的数据,而不是自制的 CSV 备份脚本。在系统之间,您应该考虑使用 Kafka 和 Aerospike Kafka 连接器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2019-02-04
    • 2023-03-27
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2017-01-07
    相关资源
    最近更新 更多