【发布时间】:2015-12-04 17:23:20
【问题描述】:
我正在尝试使用 Aerospike bulk loader 为集群播种,其中包含制表符分隔文件中的数据。
源数据如下所示:
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"] |
+--------------------------------+
我要存储的数据是一个整数列表。是否有一种简单的方法可以将存储在此 bin 中的对象转换为整数列表(可能是 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 对象。
你知道需要做什么来解决这个问题吗?
【问题讨论】:
-
在 segments 的模板中,您能否尝试声明一个整数的 dst_type 并看看它是如何工作的?
-
感谢@RonenBotzer。我尝试添加
"dst_type": "integer"。当我这样做时,AerospikeLoad 要求我还指定一个编码。奇怪的是,编码是什么似乎并不重要:任何字符串都被接受。不幸的是,当我查询aql中的集合时,数据仍然是字符串列表,而不是整数列表。
标签: lua aerospike aerospike-loader