工具
- redis-cli 3.x
- HData 0.2.8 (最新)
- jedis-*.jar
不啰嗦, 直接开整
- 导出特定规则的 key, 以 'PREFIX-' 前缀为例:
REDIS_HOST="localhost" REDIS_PORT=6379 REDIS_DB=0 redis-cli -h localhost -p 6379 -n 0 --scan --pattern "PREFIX-*" > "./keys.list"
- 使用 HData 的 wit 插件 + Jedis 读取值
## 存放 jedis 及其依赖的 jar 的文件夹 LIB_ADDON="./jars" ## 将附加的 jar 添加到 hdata 的 classpath ## 这样就可以在 wit 自由的使用了 ## 也可以通过这种方式放入自定义的 wit 插件 ## 当然也可以更简单粗暴: 直接扔到 hdata/plugins/wit/ 目录下 HDATA_CLASSPATH="./" for f in $LIB_ADDON/*.jar; do HDATA_CLASSPATH="${HDATA_CLASSPATH}:$f" done export HDATA_CLASSPATH="$HDATA_CLASSPATH" ## 技巧: 这里使用 双引号, 方便引入变量 CODE_VARS=" const host=\"${REDIS_HOST}\" const port=${REDIS_PORT} const db=${REDIS_DB} " ## 接下来是逻辑部分, 技巧: 使用单引号 不需要转义脚本里的双引号 ## 这段脚本会在每次消费一条记录的时候执行, 以固定的变量名 input 传入 ## 这里我们 使用 const 将会得到一个常量的 jedis, 不会在处理每条记录的时候都去重新创建 ## 返回值 将作为最终结果 CODE=' const jedis = redis.clients.jedis.Jedis::new(host, port) const __temp = noop( jedis.~select(db) ) var key = input[0]; // 这是 keys.list 的第一列的值 var result = newRecord() // 新建一个 record result[0] = key; result[1] = key.~substring("PREFIX-".length) //可以对 key 做简单处理 (复杂的当然也可以, 只要你愿意) result[2] = jedis.~smembers(key) // 这里演示的是得到 set 的所有值 return result ' ## 执行 hdata: 用 wit 来包裹我们的目标 Writer, 例如 我们打算导出到 hive ## 这里 wit 只会占用三个额外的配置, 其他使用原 writer 配置 (参考命令第二行) ## 这里投机使用 csv 来读取 key, 如果 key 包含逗号就需要另当别论了 ./bin/hdata --reader csv -Rpath="./keys.list" -Rstart.row=1 \ --writer wit -Wwit="$CODE_VARS $CODE" -WwitInnerWriter=hive \ -Wdatabase=test -Wtable=dist_table
// 略... var key = input[0]; var fixedKey = key.~substring("PREFIX-".length) var set = jedis.~smembers(key) var list = java.util.ArrayList::new() for(item : set) { var result = newRecord() // 新建一个 record result[0] = key result[1] = fixedKey result[2] = item list.~add(result) } // 返回一个数组或集合, 将会写入向最终输出中写入多个值 return list
关于 Wit: https://www.oschina.net/p/webit-script
关于 HData: https://www.oschina.net/p/hdata