2016-02-28 5 views
5

Ich habe eine Aggregatfunktion geschaffen, die in Aero-Spike arbeitet, die in AQL funktioniert:Aerospike NodeJS UDF Aggregation Fehler

AGGREGATE filter2.check_teamId('123', 0, 1456499994597) ON analytics.tracking 
WHERE teamId = '123' 

Dies liefert Ergebnisse. ich dann versuchen, die gleiche UDF in NodeJS zu verwenden:

var statement = { 
    aggregationUDF: {module: 'filter2', funcname: 'check_teamId', 
    arg:['123', 0, 1456499994597]} 
}; 

var query = client.query('analytics', 'tracking', statement); 
var stream = query.execute(); 

Das Ergebnis ist ein scheinbar uninformativ Fehler ist:

{ code: 100, 
    message: 'UDF: Execution Error 1', 
    func: 'as_query_aggregate', 
    file: 'src/main/aerospike/aerospike_query.c', 
    line: 903 } 

Der Server-Logs Zustand:

Feb 28 2016 22:33:58 GMT: INFO (scan): (scan.c::933) starting aggregation scan job 1201452721893048027 {analytics:tracking} priority 2

Feb 28 2016 22:33:58 GMT: INFO (scan): (scan.c::1026) finished aggregation scan job 1201452721893048027 (0)

Hat jemand haben Sie irgendwelche Tipps, um eine UDF mit NodeJS zu arbeiten? Oder irgendwelche Ideen, wie man den Fehler diagnostiziert?

Ich habe den Benutzer UDF Speicherort in der Konfiguration festgelegt, die das Ergebnis nicht beeinflusst.

UPDATE: Hier ist der lua-Code:

local function map_profile(record) 
    return map {interaction=record.interaction, 
       teamId=record.teamId, datetime=record.datetime, 
       timestamp=record.timestamp, version=record.version, 
       interactions=record.interactions} 
end 
function check_teamId(stream, teamId, startDate, endDate) 
    local function filter_teamId(record) 
    return record.teamId == teamId and 
      record.timestamp >= startDate and record.timestamp <= endDate 
    end 
    return stream : filter(filter_teamId) : map(map_profile) 
end 
+0

Wie lautet der Code für die UDF 'check_teamId'? –

+0

Sie haben auch eine 'WHERE'-Klausel in der AQL-Anweisung, aber keinen' filters'-Abschnitt in Ihrem Anweisungsobjekt in der Node.JS-Version. –

+0

Danke @AdamB. Mit dem obigen Lua-Code aktualisiert. Die WHERE-Klausel ist nicht wirklich erforderlich, und die Abfrage läuft ohne sie einwandfrei. – TStu

Antwort

3

Der wahrscheinlichste Grund, dass Sie den UDF-Ausführungsfehler (Code: 100) erhalten ist, dass das System und/oder Benutzerpfad für das LUA-Subsystem sind nicht richtig eingerichtet. Wenn Sie auf die Debug-Protokollierung für den Kunden wenden können Sie eine oder beide der folgenden Fehlermeldungen angezeigt:

Apr 04 2016 08:15:19 UTC: DEBUG(45951) [conversions.cc:248] [config_from_jsobject] - Could not find a valid LUA system path ./aerospike-client-c/package/usr/local/aerospike/client/sys/udf/lua/ 
Apr 04 2016 08:15:19 UTC: DEBUG(45951) [conversions.cc:273] [config_from_jsobject] - Could not find valid LUA user path ./aerospike-client-c/package/usr/local/aerospike/client/usr/udf/lua 

Wenn der Kunde nicht den richtigen Pfad automatisch bestimmen kann, dann müssen Sie das System/Benutzerpfad in der Konfiguration übergeben . (Siehe unten.)

Es gibt jedoch ein weiteres Problem mit Ihrem UDF-Aufruf im Node.js-Client. Die Argumente für die UDF sollten im args Element des Objekts aggregationUDF, nicht in arg übergeben werden.

Hier ist ein vollständiges Beispiel, das funktioniert für mich:

const Aerospike = require('aerospike') 

const config = { 
    hosts: '192.168.33.10:3000', 
    log: { level: 5 }, 
    modlua: { 
    userPath: './', 
    systemPath: './node_modules/aerospike/aerospike-client-c/lua/' 
    } 
} 

Aerospike.connect(config, (error, client) => { 
    if (error) throw error 

    var statement = { 
    aggregationUDF: { 
     module: 'agg', 
     funcname: 'check_teamId', 
     args: ['123', 0, 1456499994597] 
    } 
    } 
    var query = client.query('test', 'tracking', statement) 
    var stream = query.execute() 

    var count = 0 
    stream.on('error', (error) => console.error('error:', error)) 
    stream.on('data', (result) => { 
    count++ 
    console.log('result:', result) 
    }) 
    stream.on('end',() => { 
    console.log('found %d records', count) 
    client.close() 
    }) 
}) 

Beachten Sie, dass dieses Beispiel die [email protected] Client-Version verwendet, die nur released war. Die Einrichtung und Ausführung einer UDF-Abfrage ist jedoch identisch mit dem v1.x-Client.

Ich habe dieses Beispiel auch auf Github here hochgeladen. Dieser Gist enthält auch ein Skript setup.js zum Erstellen einiger Beispieldatensätze basierend auf was Ihre map_profile Funktion erwartet.

Fühlen Sie sich frei, dies in unserer user forum weiter zu verfolgen. Ich würde gerne hören, wenn Sie dies für Ihre Anwendung arbeiten lassen. (Oder ein anderes Feedback zum Aerospike Node.js-Client!)

+0

Danke, @ Jan-Hecking wird es versuchen – TStu