在塞式記錄是元組(鍵,元數據,倉)。一個Aerospike UDF written in Lua,不管它是一個record UDF或stream UDF,只能返回所支持的類型之一 - 字符串,整數,雙,單,地圖,字節(見:Known Limitations)。
在流UDF,如果你只有你還需要記錄的濱名/ bin中值對轉換爲地圖,並返回一個過濾器:
local function bins_match_filter(bin1, bin2)
return function(rec)
if rec[bin1] and rec[bin2] and
(type(rec[bin1]) == type(rec[bin2])) and
rec[bin1] == rec[bin2] then
return true
end
return false
end
end
local function record_to_map(rec)
local ret = map()
for i, bin_name in ipairs(record.bin_names(rec)) do
ret[bin_name] = rec[bin_name]
end
return ret
end
function check_bins_match(stream, bin1, bin2)
return stream : filter(bins_match_filter(bin1, bin2)) : map(record_to_map)
end
您可能能夠將某些基於UDF的流式濾鏡轉換爲predicate filter表達式。它不適用於上面的例子,因爲沒有辦法比較兩個bin的值。但是對於大多數情況,謂詞表達式操作是足夠的(請參閱Java客戶端的PredExp類)。您根本不需要調用UDF,這會運行速度更快,擴展性更好,而且您不需要將記錄轉換爲bin名稱/值對映射。
感謝pgupta爲您的迴應。是的,我知道我可以返回密鑰和摘要,並且通過閱讀各種文檔和白皮書,我明白記錄摘要是RIPEMD160等。我真正關心的是效率問題。我想在一次傳遞中返回所有數據,因此讓數據在那裏顯得很奇怪,返回鍵並返回數據?我也可以將選擇的列(我想要的全部或其他)傳遞給UDF並迭代地構建地圖,但這又似乎效率低下。或者,我還沒有試過這個,但是這個記錄似乎有bin名字... – ismisesisko
剛剛從記錄流中返回一組過濾記錄的用例是什麼,也就是說,您希望所有數據都發送到一個客戶端節點並在客戶端節點做一些計算? Aerospike提供1)記錄udfs以修改服務器上的記錄或2)以只讀模式對一組記錄進行操作的udfs,並允許您在這些記錄中彙總信息。因此使用流udfs,您可以使用羣集上的每個節點獲取map-reduce類型的計算能力,以對其記錄集進行計算,並在客戶機節點中進行最終減少。 – pgupta