2017-06-18 2 views
0

Aerospikeにフィルタとマップを含むudfストリームがあります。方法:マップなしでaerospike udfフィルターを作成するか、マップに完全なレコードを返します

私が見たすべての例によると、私はレコードからフィールドを選び、フィルタリングされ選択されたフィールドを持つ新しいマップを返すことができます。しかし、私はそれをしたくありません。私はどのようなストリームでも、どんなコラム/ビンでも、フィルタを適用してフルレコードを返すことを望みます。 1つのアプローチは、stream:fiter(my_filter)のようなものを使用し、マップを使用しないことです。直感的に(少なくとも私にとっては)これはストリームをフィルタリングして中継するだけです。これは、私の欲求不満に、動作しないようです。私が試した次のことは、マップを使用することですが、単純に完全なレコードを中継します。これはどちらもうまくいきません。両方のケースで、私はそれが私の結果として空リストを取得しないと言うとき。

これがどのように機能するのかを親切に説明できますか?それは私を絶対にナッツを運転している。 これは、世界で最も基本的なものの1つで、udfsと関係があります。私は、udfsでもっと複雑なことをたくさんやったことを指摘しなければならないが、何らかの理由でこれが私にとって問題である。

答えて

2

欠けていることは、UDFの戻り値でレコード型またはストリーム型を返すことができないことです。私は、すべての戻り値のタイプが、Aerospikeシステムのluaモジュールによってクライアント固有の型にマッピングされると信じています。レコード "タイプ"をマップすることはできません。

レコードを取得したい場合は、キーをビンに格納し、そのビンをマップタイプまたは文字列タイプまたは整数タイプ(アプリケーションに最も適したタイプ)に戻します。マップタイプのレコードメタデータからレコードダイジェストを返すこともできます。私はUDFを介してレコードダイジェストを取得して返しますが、試してみる価値はありません。

名前空間、キー、または名前空間&レコードダイジェストを設定したら、クライアントAPIからレコードにアクセスできます。レコードダイジェストは、セット名とキーの組み合わせから計算されたRIPEMD160ハッシュです。

+0

ご回答いただきありがとうございます。はい、私は鍵とダイジェストを返すことができると認識しています。レコードダイジェストはRIPEMD160などで、さまざまなドキュメントやホワイトペーパーを読むことができます。私の本当の懸念は、効率についてです。私はすべてのデータを1回のパスで返したいので、そこにデータを置いてキーを返してからデータに戻るのが奇妙なようです。また、選択した列をUDFに渡して繰り返しマップを作成することもできますが、やはり効率が悪いようです。 OR、私はこれを試していないが、レコードがビン名を持っているようだ... – ismisesisko

+0

レコードのストリームからフィルタリングされたレコードのセットを返すだけのユースケースは何ですか、つまり、クライアントノードで何らかの計算を行いますか? Aerospikeは、1)サーバー上のレコードを変更するためのudfsを記録するか、または2)読み取​​り専用モードでレコードセットに作用し、それらのレコードに情報を集約させるストリームudfsを提供します。 stream udfsを使用すると、クラスター上の各ノードを使用してmap-reduceタイプの計算機能を使用して、レコードセットの計算を行い、クライアントノードでの最終的な削減を行います。 – pgupta

0

私は何かが不足していると思う。 レコードudfsを使用してレコードを更新し、udfsをストリームしてクエリ/マップを減らしました。問題は、私がすべての列を選択できるようにと思われるマップです。それらを検査せずに中継する。同等のSQLシステムと比較してください(この比較を行うことは必ずしも妥当とは限りません)。私は真のマップなしでudfsのフィルタ部分を使いたいです。どうして?セカンダリインデックスなしでセットを選択してフィルタリングする方法がないため、複数のフィルタが必要です。私はこれをどのようにして行うのですか?

+0

ストリームudfに引数を渡し、それらの引数に基づいてフィルタリングすることで、複数のフィルタを実行できます。複数のフィルタについては、https://discuss.aerospike.com/t/record-manipulation-with-more-than-one-filterを参照してください。 -lua/3637 - 戻り値の場合は、マップ内のすべてのビンを返すか、ダイジェストをクライアントに返します。 – pgupta

+0

もう一度、ありがとう、私はこれを見て、私はすでに複数のフィルタを使用しています。私は一日の終わりに短い答えは、それが私が好む方法で行うことはできないと思う。私がすることは、すべてのビンを繰り返してマップを作成することです。それは大きな問題ではなく、ちょうどクリーンな方法があると思った。あなたのコメントとアドバイスをいただきありがとうございます。 – ismisesisko

+0

AerospikeのレコードはRDBMS(Aerospikeは行指向のデータベース)の行に似ていますが、まったく同じではありません。レコードはタプル(キー、メタデータ、ビン)です。 RDBMSの行はちょうど_bins_です。つまり、キーの名前が列名で、キーの値が特定の行の列の値であるマップです。したがって、レコード内のすべてのビンの名前と値のペアをマップにキャストし、ストリームUDFからその値を戻す必要があります。 –

0

エアロスパイクのレコードは、タプル(キーメタデータビン)です。 record UDFであるかstream UDFであるかにかかわらず、Aerospike UDF written in Luaは、サポートされている型(文字列、整数、倍精度、リスト、マップ、バイト)を返すことができます(Known Limitations参照)。ストリームUDFで

、あなただけがまだマップにレコードのビン名/ビン値のペアをキャストし、それを返すために必要なフィルタを持っている場合:

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式に変換することができます。 2つのビンの値を比較する方法がないので、上記の例ではうまくいきません。しかし、ほとんどの場合、述語式の操作は適切です(JavaクライアントのクラスPredExpを参照してください)。 UDFをまったく呼び出す必要はありません。これははるかに速く、より優れたスケーラビリティを持ち、レコードをビン名と値のペアのマップにキャストする必要はありません。

関連する問題