文档章节

如何使用 HData + Wit 导出 Redis 中的数据

zqq90
 zqq90
发布于 2017/11/25 13:50
字数 572
阅读 476
收藏 7

工具

  • 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

© 著作权归作者所有

共有 人打赏支持
zqq90

zqq90

粉丝 69
博文 11
码字总数 5645
作品 1
海淀
程序员
私信 提问
HData——ETL 数据导入/导出工具

HData是一个异构的ETL数据导入/导出工具,致力于使用一个工具解决不同数据源(JDBC、Hive、HDFS、HBase、MongoDB、FTP、Http、CSV、Excel、Kafka等)之间数据交换的问题。HData在设计上同时参...

oschina
2016/07/10
966
0
[转]用C写有面向对象特点的程序

转一个比较老的帖子: 原文地址:http://blog.csdn.net/haoel/article/details/2864 作者:陈皓 比如在一个项目中,有大量的数据结构,他们都是双向链表,但又想共用一套对链表的操作算法,这...

晓寒
2011/11/15
972
5
VC怎样把一副自己画的图存成BMP格式和在VC++下实现高彩色工具条

VC怎样把一副自己画的图存成BMP格式 int SaveBmp(HANDLE hData,LPSTR filename) { BITMAPFILEHEADER bfh; BITMAPINFOHEADER *lpbi=(BITMAPINFOHEADER*)hData; bfh.bfType=0x4D42; //BM bfh.......

长平狐
2013/01/06
548
0
HData通过Maven时出现错误

@Jayer 你好,想跟你请教个问题:在使用Maven编译时出现如下错误,请求解答。

石岩
2016/08/04
559
8
2016 年度开源中国新增开源软件排行榜 TOP 100

2016 年度开源中国新增开源软件排行榜 TOP 100 新鲜出炉!本榜单根据 2016 年开源中国新收录的 3030 款软件的关注度和活跃度排名,整理出其中最受欢迎的 100 款软件,它们在一定程度上预示着...

oschina
2017/01/10
35.5K
41

没有更多内容

加载失败,请刷新页面

加载更多

EOS官方钱包keosd

EOS官方钱包的名称是keosd,它负责管理你的私钥,并且帮你进行交易的签名。 不过不幸的是,keosd钱包对普通用户并不友好,它是一个命令行程序,目前还没有像以太坊的mist那样的图形化界面,而...

汇智网教程
21分钟前
1
0
ArrayList的实现原理以及实现线程安全

一、ArrayList概述 ArrayList是基于数组实现的,是一个动态的数字,可以自动扩容。 ArrayList不是线程安全的,效率比较高,只能用于单线程的环境中,在多线程环境中可以使用Collections.syn...

一看就喷亏的小猿
38分钟前
2
0
Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
4
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
8
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部