Aerospike: 如何批量加载整数列表到一个Bin中?
2015-12-4 23:33:4
收藏:0
阅读:98
评论:1
我正在尝试使用[Aerospike批量加载程序](https://github.com/aerospike/aerospike-loader“ Aerospike批量加载程序”)从制表符分隔的文件中向集群种植数据。
源数据如下:
set key segments
segment 123 10,20,30,40,50
segment 234 40,50,60,70
第三列'segments'包含一个逗号分隔的整数列表。
我创建了一个JSON模板:
{
"version" : "1.0",
"input_type" : "csv",
"csv_style": { "delimiter": " " , "n_columns_datafile": 3, "ignore_first_line": true}
"key": {"column_name":"key", "type": "integer"},
"set": { "column_name":"set" , "type": "string"},
"binlist": [
{"name": "segments",
"value": {"column_name": "segments", "type": "list"}
}
]
}
并运行加载程序:
java -cp aerospike-load-1.1-jar-with-dependencies.jar com.aerospike.load.AerospikeLoad -c template.json data.tsv
当我在aql中查询记录时,它们似乎是字符串列表:
aql> select * from test
+--------------------------------+
| segments |
+--------------------------------+
| ["10", "20", "30", "40", "50"] |
| ["40", "50", "60", "70"] |
+--------------------------------+
我试图存储的数据是整数列表。是否有一种轻松的方法将存储在此章节中的对象转换为整数列表(可能是Lua UDF)或者可能有一种方法可以进行批量加载程序模板的调整?
##更新: 我试图创建一个Lua UDF以将列表从字符串转换为整数:
function convert_segment_list_to_integers(rec)
for i=1, table.maxn(rec['segments']) do
rec['segments'][i] = math.floor(tonumber(rec['segments'][i]))
end
aerospike:update(rec)
end
…注册了它:
aql> register module 'convert_segment_list_to_integers.lua'
…然后尝试对我的集合执行:
aql> execute convert_segment_list_to_integers.convert_segment_list_to_integers() on test.segment
我启用了更详细的日志记录并注意到UDF出现错误。显然,它期望传递'table'而传递'userdata':
Dec 04 2015 23:23:34 GMT: DEBUG (udf): (udf_rw.c:send_result:527) FAILURE when calling convert_segment_list_to_integers convert_segment_list_to_integers ...rospike/usr/udf/lua/convert_segment_list_to_integers.lua:2: bad argument #1 to 'maxn' (table expected, got userdata)
Dec 04 2015 23:23:34 GMT: DEBUG (udf): (udf_rw.c:send_udf_failure:407) Non-special LDT or General UDF Error(...rospike/usr/udf/lua/convert_segment_list_to_integers.lua:2: bad argument #1 to 'maxn' (table expected, got userdata))
似乎“maxn”不适用于“userdata”对象。
您是否可以看到需要完成的内容以解决此问题?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
要将具有字符串值的列表转换为整数值列表,您可以运行以下记录UDF:
function convert_segment_list_to_integers(rec) local list_with_ints = list() for value in list.iterator(rec ['segments']) do local int_value = math.floor(tonumber(value)) list.append(list_with_ints, int_value) end rec['segments'] = list_with_ints aerospike:update(rec) end在编辑现有的lua模块时,请确保重新运行
register module'convert_segment_list_to_integers.lua'。这个问题的原因在于aerospike-loader工具:正如您在以下java代码中看到的那样,它总是假定/强制为字符串:
case LIST: /* *假设 * 1.项目由冒号“,”分隔 * 2.项目值将是一个字符串 * 3.列表将用双引号括起来 * *不支持嵌套映射或嵌套列表 * **/ List<String> list = new ArrayList<String>(); String[] listValues = binRawText.split(Constants.LIST_DELEMITER,-1); if(listValues.length > 0){ for(String value:listValues) { list.add(value.trim()); } Bin.作为列表(binColumn.getBinNameHeader(),列表); } else { bin = 0; log.error("错误:无法解析为列表:"+binRawText); } 破裂;Github上的源:http://git.io/vRAQW
如果您喜欢,可以修改此代码并重新编译以始终假定整数列表值。将第266行和第270行更改为类似于以下内容(未经测试):
List<Integer> list = new ArrayList<Integer>(); list.add(Integer.parseInt(value.trim());