使用 Aerospike Python Client udf 从 Aerospike 中的所有记录中删除多个 bin
Deleting multiple bins from all the records of a set in Aerospike using Aerospike Python Client udf
如何使用 Aerospike Python 客户端 udf 从 Aerospike 中的所有记录中删除多个 bin?我尝试一次将一个 bin 传递给 udf,并使用 scan
从所有记录中删除该 bin,但正如预期的那样效率非常低。我还尝试在 python 中创建一个 bin 列表并将该列表传递给 UDF。以下为参考代码:
假设我有 2000 条记录和 200 个名为“1”、“2”、“3”...等的 bin。我想删除从“1”到“99”的 bin。使用的命名空间是 testns
,使用的集合是 udfBins
。 testUdf.lua
是包含 udf 的 lua 文件,my_udf
是 lua 函数名称。
test.py
scan = client.scan("testns", "udfBins")
bins = [str(i) for i in range(1,366)]
# for i in range(1,100):
scan.apply("testUdf", "my_udf", [bins])
job_id = scan.execute_background()
while True:
response = client.job_info(job_id, aerospike.JOB_SCAN)
if response["status"] != aerospike.JOB_STATUS_INPROGRESS:
break
print("job done")
testUdf.lua
function my_udf(rec, bins)
info(bins)
for bin in python.iter(bins)
do
rec[bin] = nil
end
aerospike:update(rec)
end
上面的代码不起作用,我无法找出原因和解决手头问题的正确方法。非常感谢任何帮助。
非常感谢
这个问题有点棘手。我们必须将一个从 python 到 lua 的数组作为参数传递给 lua 函数。这是我用来使其工作的代码的相关部分:
1 - 将数组作为字符串传递,如下所示:
bins = '{"1","2"}'
# print(bins)
self.client.scan_apply("test", "users", "testUdf", "my_udf", [bins])
注意:在scan_apply中(函数名有下划线,args作为列表传递,这里只有一个arg - 在lua中我们转换为[=39=的字符串bin ] 输入并迭代。
然后在您的 testUdf.lua 中执行:
function my_udf(rec, bins_list)
bins_list = load("return "..bins_list)()
for i,bin in ipairs(bins_list)
do
-- debug("bins_list_item: "..bin)
rec[bin] = nil
end
aerospike:update(rec)
end
我在调试级别使用日志记录(您有信息)来检查 lua 代码在做什么。
这对我有用。
我使用 bin“1”、“2”和“3”创建了 3 条记录,然后使用上述扫描 udf 删除了 bin“1”和“2”。
这是 运行 扫描后一条记录的示例输出:
{'3': 1, '1': 1, '2': 1} <-- initial bins, 3 records, same bins, same values
{"1","2"} <--list that I passed as a string for setting these bins to nil
{'3': 1} <-- final bins
我检查了 AQL,所有 3 条记录都删除了 bin“1”和“2”。
aql> select * from test.users
+---+
| 3 |
+---+
| 1 |
| 1 |
| 1 |
+---+
3 rows in set (0.123 secs)
这是一个很好的link进一步阅读:https://discuss.aerospike.com/t/what-is-the-syntax-to-pass-2d-array-values-to-the-record-udf-using-aql/4378
如何使用 Aerospike Python 客户端 udf 从 Aerospike 中的所有记录中删除多个 bin?我尝试一次将一个 bin 传递给 udf,并使用 scan
从所有记录中删除该 bin,但正如预期的那样效率非常低。我还尝试在 python 中创建一个 bin 列表并将该列表传递给 UDF。以下为参考代码:
假设我有 2000 条记录和 200 个名为“1”、“2”、“3”...等的 bin。我想删除从“1”到“99”的 bin。使用的命名空间是 testns
,使用的集合是 udfBins
。 testUdf.lua
是包含 udf 的 lua 文件,my_udf
是 lua 函数名称。
test.py
scan = client.scan("testns", "udfBins")
bins = [str(i) for i in range(1,366)]
# for i in range(1,100):
scan.apply("testUdf", "my_udf", [bins])
job_id = scan.execute_background()
while True:
response = client.job_info(job_id, aerospike.JOB_SCAN)
if response["status"] != aerospike.JOB_STATUS_INPROGRESS:
break
print("job done")
testUdf.lua
function my_udf(rec, bins)
info(bins)
for bin in python.iter(bins)
do
rec[bin] = nil
end
aerospike:update(rec)
end
上面的代码不起作用,我无法找出原因和解决手头问题的正确方法。非常感谢任何帮助。
非常感谢
这个问题有点棘手。我们必须将一个从 python 到 lua 的数组作为参数传递给 lua 函数。这是我用来使其工作的代码的相关部分:
1 - 将数组作为字符串传递,如下所示:
bins = '{"1","2"}'
# print(bins)
self.client.scan_apply("test", "users", "testUdf", "my_udf", [bins])
注意:在scan_apply中(函数名有下划线,args作为列表传递,这里只有一个arg - 在lua中我们转换为[=39=的字符串bin ] 输入并迭代。
然后在您的 testUdf.lua 中执行:
function my_udf(rec, bins_list)
bins_list = load("return "..bins_list)()
for i,bin in ipairs(bins_list)
do
-- debug("bins_list_item: "..bin)
rec[bin] = nil
end
aerospike:update(rec)
end
我在调试级别使用日志记录(您有信息)来检查 lua 代码在做什么。 这对我有用。 我使用 bin“1”、“2”和“3”创建了 3 条记录,然后使用上述扫描 udf 删除了 bin“1”和“2”。
这是 运行 扫描后一条记录的示例输出:
{'3': 1, '1': 1, '2': 1} <-- initial bins, 3 records, same bins, same values
{"1","2"} <--list that I passed as a string for setting these bins to nil
{'3': 1} <-- final bins
我检查了 AQL,所有 3 条记录都删除了 bin“1”和“2”。
aql> select * from test.users
+---+
| 3 |
+---+
| 1 |
| 1 |
| 1 |
+---+
3 rows in set (0.123 secs)
这是一个很好的link进一步阅读:https://discuss.aerospike.com/t/what-is-the-syntax-to-pass-2d-array-values-to-the-record-udf-using-aql/4378