dataX案例-从hbase中读取数据,写入到文本文件中

news/2023/6/5 21:27:12

HbaseReader 插件原理
HbaseReader 插件实现了从 Hbase中读取数据。在底层实现上,HbaseReader 通过 HBase 的 Java 客户端连接远程 HBase 服务,并通过 Scan 方式读取你指定 rowkey 范围内的数据,并将读取的数据使用 DataX 自定义的数据类型拼装为抽象的数据集,并传递给下游 Writer 处理。

HbaseReader 插件官方文档,有介绍各个参数的说明
https://github.com/alibaba/DataX/blob/master/hbase094xreader/doc/hbase094xreader.md

TxtFileWriter插件官方文档,有介绍各个参数的说明
https://github.com/alibaba/DataX/blob/master/txtfilewriter/doc/txtfilewriter.md

读取有两种模式
normal 模式
multiVersionFixedColumn模式

normal 模式:把HBase中的表,当成普通二维表(横表)进行读取,读取最新版本数据。

multiVersionFixedColumn模式:把HBase中的表,当成竖表进行读取。
读出的每条记录一定是四列形式,依次为:rowKey,family:qualifier,timestamp,value。
读取时需要明确指定要读取的列,把每一个 cell 中的值,作为一条记录(record),若有多个版本就有多条记录(record)。

为演示效果,先将hbase中表,列族的版本数改一下,这里改成3个版本,并添加多个版本的数据
为方便插入多个版本的数据,可看以下博文 (mysql到hbase),最下面最下面
https://blog.csdn.net/qq_41712271/article/details/108610591

//建表
create 'ns1:product','f1'
//修改列族的版本数
alter 'ns1:product',{'NAME'=>'f1','VERSIONS'=>'3'}
//检查,是否修改成功
desc 'ns1:product'//如这里每列有两个版本的数据,111为一个版本,222为一个版本 (productId和title组成的rowkey,所以一样)
get 'ns1:product', '23_电视', {COLUMN => 'f1', VERSIONS => 3}
COLUMN                                      CELLf1:addTime                                 timestamp=222222222, value=2020-02-01 23:05:31f1:addTime                                 timestamp=111111111, value=2019-02-01 23:05:31f1:num                                     timestamp=222222222, value=22f1:num                                     timestamp=111111111, value=11f1:productId                               timestamp=222222222, value=23f1:productId                               timestamp=111111111, value=23f1:title                                   timestamp=222222222, value=电视f1:title                                   timestamp=111111111, value=电视

normal 模式 示例代码

{"job": {"setting": {"speed": {"channel": 1}},"content": [{"reader": {"name": "hbase11xreader","parameter": {"hbaseConfig": {"hbase.zookeeper.quorum": "kncloud02:2181,kncloud03:2181,kncloud04:2181","hbase.cluster.distributed": true,"zookeeper.znode.parent": "/hbase-unsecure"},"table": "ns1:product","encoding": "utf-8","mode": "normal","column": [{"name": "rowkey","type": "string"},{"name": "f1:productId","type": "string"},{"name": "f1:title","type": "string"},{"name": "f1:num","type": "string"},{"name": "f1:addTime","type": "date","format":"yyyy-MM-dd HH:mm:ss"}],"range": {"startRowkey": "","endRowkey": "","isBinaryRowkey": true}}},"writer": {"name": "txtfilewriter","parameter": {"path": "/usr/local/datax/linshiwenjian","fileName": "product","writeMode": "truncate"}}}]}
}

multiVersionFixedColumn模式 示例代码
改动的位置
"mode": "multiVersionFixedColumn",
 "maxVersion": "-1",

{"job": {"setting": {"speed": {"channel": 1}},"content": [{"reader": {"name": "hbase11xreader","parameter": {"hbaseConfig": {"hbase.zookeeper.quorum": "kncloud02:2181,kncloud03:2181,kncloud04:2181","hbase.cluster.distributed": true,"zookeeper.znode.parent": "/hbase-unsecure"},"table": "ns1:product","encoding": "utf-8","mode": "multiVersionFixedColumn","maxVersion": "-1","column": [{"name": "rowkey","type": "string"},{"name": "f1:productId","type": "string"},{"name": "f1:title","type": "string"},{"name": "f1:num","type": "string"},{"name": "f1:addTime","type": "date","format": "yyyy-MM-dd HH:mm:ss"}],"range": {"startRowkey": "","endRowkey": ""}}},"writer": {"name": "txtfilewriter","parameter": {"path": "/usr/local/datax/linshiwenjian","fileName": "product_multiVersions","writeMode": "truncate"}}}]}
}

最终执行后,各个模式的结果

normal 模式 的结果
| rowKey | f1:productId | f1:title | f1:num | f1:addTime |
23_电视,     23,           电视,       22,     2020-02-01 23:05:31
24_手机,     24,           手机,       66,     2020-02-25 23:05:52multiVersionFixedColumn 模式 的结果
| rowKey | column:qualifier | timestamp | value |
23_电视,   f1:addTime,         222222222,  2020-02-01 23:05:31
23_电视,   f1:addTime,         111111111,  2019-02-01 23:05:31
23_电视,   f1:num,             222222222,  22
23_电视,   f1:num,             111111111,  11
23_电视,   f1:productId,       222222222,  23
23_电视,   f1:productId,       111111111,  23
23_电视,   f1:title,           222222222,  电视
23_电视,   f1:title,           111111111,  电视
24_手机,   f1:addTime,         222222222,  2020-02-25 23:05:52
24_手机,   f1:addTime,         111111111,  2019-02-25 23:05:52
24_手机,   f1:num,             222222222,  66
24_手机,   f1:num,             111111111,  55
24_手机,   f1:productId,       222222222,  24
24_手机,   f1:productId,       111111111,  24
24_手机,   f1:title,           222222222,  手机
24_手机,   f1:title,           111111111,  手机

 


https://dhexx.cn/news/show-18073.html

相关文章

使用easyexcel实现Excel数据导入以及数据库数据导出成Excel

使用easyexcel实现Excel数据导入以及数据库数据导出成Excel一、效果1、数据库中数据2、导出接口3、导出内容4、导入接口5、打印内容二、依赖三、数据库四、代码1、控制层2、逻辑层3、持久层4、xml5、实体类以及其他数据类6、工具类7、配置文件一、效果 1、数据库中数据 2、导出…

关于GDAL打开hfa大文件的问题[转]

今天在使用GDAL打开大的img文件的时候,(这里所谓的大文件指的是img文件太大,会将数据文件存放到ige格式raw文件中)。在讲img文件和ige文件重命名后,使用GDAL打开文件后,只能读取到文件信息,不能…

GPT-4的前世、今生和未来!

文 | 王思若前言诚然,从关系数据库到互联网信息检索,每一次知识表示和调用方式的跃迁都会在科技史引起一场巨大的技术变革。当ChatGPT发布之后,生成式AI成了新的技术范式,这场变革从微软、Google、百度这一众搜索引擎开始&#xf…

Java中判断两个Long类型是否相等

Java中判断两个Long类型是否相等一、为什么同样的类型,同样的值,却不相等呢?1、探索一下源码二、解决方案1、可以使用.longValue()2、equals()进行比较三、例子一、为什么同样的类型,同样的值,却不相等呢? …

C语言数据结构-创建链表的四种方法

结点类型: typedef int datatype; typedef struct NODE{ datatype data; struct NODE *next; }Node,*LinkList; 1、不带头结点的头插入法创建链表。 每创建一个结点,都使该结点成为头结点,这样头结点不断地向前移动,就可以创建一个…

关于多分辨率适应

问题描述大家都用什么方法解决多分辨率问题呢?我参照网上的建立多个layout文件夹的方式,好像没效果。建了两个目录,不同布局想支持多分辨率。还有个默认的layout布局跟1280X720一样的。但是我在一个1280X720的手机上,显示的是854X…

Mysql给普通和分页查询结果加序号

Mysql给普通和分页查询结果加序号一、效果展示1、普通查询加序号2、分页查询加序号二、表结构以及数据三、解释说明1、解释2、相关知识点3、 和 : 的区别:一、效果展示 1、普通查询加序号 SELECT t1.NAME,( i : i 1 ) AS 序号 FROM t1,( SELECT i : 0 ) AS itab…

linux系统,赋予 某个用户如 hadoop 用户 sudo 权限

在工作中一般不会让我们通过 root 用户来操作,因此我们给某个用户如 hadoop 用于赋予 sudo 权限。 这时会进入/etc/sudoers 文件的编辑页面,增加如下配置即可:#表示 hadoop 用户可以在任何位置运行任何命令 hadoop ALL(…

SharePoint Server 2013开发之旅(三):为SharePoint Server配置App开发、部署、管理环境...

上一篇我讲解了如何利用微软提供的Office 365开发人员网站,进行在线的SharePoint App开发,这当然是不错的一个选择,因为你可以快速地进行开发和调试。(仅仅针对App开发而言)。但是,你可能会想到一个问题&am…

Java8的stream之groupingBy()分组排序

Java8的stream之groupingBy()分组排序一、默认升序排序二、descendingMap()降序排序三、总结groupingBy()是Stream API中最强大的收集器Collector之一,提供与SQL的GROUP BY子句类似的功能。需要指定一个属性才能使用,通过该属性执行分组。我们通过提供功…