2016-03-30 5 views
0

Kann nicht verstehen, warum aggregateQuery immer ein leeres Ergebnis zurückgibt. Versucht, in aql, das gleiche Problem zu testen: 0 Zeilen im Satz.Aerospike: lua udf gibt immer ein leeres Ergebnis zurück, selbst wenn udf ohne Filter zurückfließt usw.

Indizes sind alle da.

aql> show indexes 
+---------------+-------------+-----------+------------+-------+------------------------------+-------------+------------+-----------+ 
| ns   | bin   | indextype | set  | state | indexname     | path  | sync_state | type  | 
+---------------+-------------+-----------+------------+-------+------------------------------+-------------+------------+-----------+ 
| "test"  | "name"  | "NONE" | "profiles" | "RW" | "inx_test_name"    | "name"  | "synced" | "STRING" | 
| "test"  | "age"  | "NONE" | "profiles" | "RW" | "inx_test_age"    | "age"  | "synced" | "NUMERIC" | 


aql> select * from test.profiles 
+---------+-----+ 
| name | age | 
+---------+-----+ 
| "Sally" | 19 | 
| 20  |  | 
| 22  |  | 
| 28  |  | 
| "Ann" | 22 | 
| "Bob" | 22 | 
| "Tammy" | 22 | 
| "Ricky" | 20 | 
| 22  |  | 
| 19  |  | 
+---------+-----+ 
10 rows in set (0.026 secs) 


aql> AGGREGATE mystream.avg_age() ON test.profiles WHERE age BETWEEN 20 and 29 
0 rows in set (0.004 secs) 
+1

Können Sie die lua-Datei und das Abfrageergebnis über aql für das gleiche mit ohne UDF Aufruf teilen. – sunil

+0

Haben Sie einen Index auf dem _age_ bin? Was passiert, wenn Sie nur SELECT von Test.profiles WHERE zwischen 20 und 29 Jahre alt? Außerdem müssen Sie Ihr Lua-Modul zeigen, um dies herauszufinden. –

Antwort

1

Es scheint, dass Sie das Beispiel here versuchen.
Es gibt zwei Probleme mit dem udf-Skript. Ich fügen Sie den Code des Lua Script:

function avg_age(stream) 

    local function female(rec) 
    return rec.gender == "F" 
    end 

    local function name_age(rec) 
    return map{ name=rec.name, age=rec.age } 
    end 

    local function eldest(p1, p2) 
    if p1.age > p2.age then 
     return p1 
    else 
     return p2 
    end 
    end 

    return stream : filter(female) : map(name_age) : reduce(eldest) 
end 

Erstens gibt es kein bin 'Geschlecht' in Ihrem Set benannt, so dass Sie bekam 0 Zeilen nach aggregateQuery.
Zweitens macht dieses Skript nicht genau das, was der Funktionsname 'avg_age' bedeutet, es gibt nur den ältesten Datensatz mit Namen und Alter zurück.

Ich füge meinen Code unter, es ersetzt nur die Funktion reduzieren, und warnt die Karte und Filterfunktion, um die Nachfrage zu erfüllen. Sie können den Filterprozess einfach überspringen.

function avg_age(stream) 
    count = 0 
    sum = 0 

    local function female(rec) 
    return true 
    end 

    local function name_age(rec) 
    return rec.age 
    end 

    local function avg(p1, p2) 
    count = count + 1 
    sum = sum + p2 
    return sum/count 
    end 

    return stream : filter(female) : map(name_age) : reduce(avg) 
end 

Die Ausgabe sieht wie unten:

AGGREGATE mystream.avg_age() ON test.avgage WHERE age BETWEEN 20 and 29 
+---------+ 
| avg_age | 
+---------+ 
| 22  | 
+---------+ 
1 row in set (0.001 secs)