【问题标题】:Aerospike NodeJS UDF Aggregation ErrorAerospike NodeJS UDF 聚合错误
【发布时间】:2016-06-11 21:11:36
【问题描述】:

我创建了一个在 aerospike 中工作的聚合函数,它在 AQL 中工作:

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

这会返回结果。 然后我尝试在 NodeJS 中使用相同的 UDF:

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

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

结果是一个看似没有信息的错误:

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

服务器记录状态:

格林威治标准时间 2016 年 2 月 28 日 22:33:58:INFO(扫描):(scan.c::933)开始 聚合扫描作业 1201452721893048027 {analytics:tracking} 优先级 2

格林威治标准时间 2016 年 2 月 28 日 22:33:58:INFO(扫描):(scan.c::1026) 完成聚合扫描作业 1201452721893048027 (0)

有没有人有任何关于让 UDF 与 NodeJS 一起工作的技巧? 或者任何想法如何诊断错误?

我在配置中设置了用户UDF位置,不影响结果。

更新: 这是lua代码:

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

【问题讨论】:

  • check_teamId UDF 的代码是什么?
  • 另外,您在 AQL 语句中有一个 WHERE 子句,但在 Node.JS 版本的语句对象中没有 filters 部分。
  • 感谢@AdamB。用上面的 lua 代码更新。 WHERE 子句实际上不是必需的,没有它查询也能正常运行。

标签: node.js lua udf aerospike


【解决方案1】:

您收到 UDF 执行错误(代码:100)的最可能原因是 LUA 子系统的系统和/或用户路径设置不正确。如果您为客户端打开调试日志记录,您可能会看到以下一条或两条错误消息:

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

如果客户端不能自动确定正确的路径,那么你必须在配置中传递系统/用户路径。 (见下文。)

但是在 Node.js 客户端中调用 UDF 存在另一个问题。 UDF 的参数应该在aggregationUDF 对象的args 元素中传递,而不是在arg 中。

这是一个适合我的完整示例:

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()
  })
})

请注意,此示例使用 aerospike@2.0.0-alpha.1 客户端版本,它只是 released。但是 UDF 查询的设置和执行与 v1.x 客户端相同。

我也把这个例子上传到了 Github here。此 Gist 还包含一个 setup.js 脚本,用于根据您的 map_profile 函数的预期创建一些示例记录。

请随时通过我们的user forum 跟进此事。我很想知道您是否可以将此用于您的应用程序。 (或有关 Aerospike Node.js 客户端的任何其他反馈!)

【讨论】:

  • 谢谢,@jan-hecking 会试一试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多