纸上得来终觉浅

程序员的圈子里有一个现象:一个毕业生刚刚走出校园的时候,不管有多少实战经验,大都可以归为“小白”一类。“小白”并没有任何贬低之意,反而我称之为“可爱的小白”。小白求知若渴,精力充沛,进步很快,基本上3年之后就可以成长起来独当一面了。

头三年的时间,大部分人完成了原始积累,我就称这段时间为积累期吧。接下来的两三年是一个关键时期,姑且叫它分化期吧。一些人继续求知若渴继续快速进步,一些人安于现状无心进取。这时候的分化大多不是特别明显,对个人的影响也不见得很大。分化期中的人,主要差别是毅力目标。随着工作时间越来越长,区别会越来越大。

五六年的时间过去了,如果小白一直坚守着某一领域,他应该已经成为团队中的中坚力量了。有的已经领导团队,有的已经是团队不可或缺的核心。接下来的几年时间呢?我将它成为煎熬期。(叫它煎熬期是不是太负能量啦?要不要改个名叫扩展期呢)这个时期的程序员们都差不多而立,要么忙着买房结婚,要么忙着迎接家庭新成员同时照顾老人。时间精力与很多花在工作之外了,工作上的投入产出相应减少,甚至有力不从心的感觉。有人把自己和所处的行业放在“社会”这个版图上,跟一些高富帅的行业进行比较,会自卑会气馁,觉得自己没有得到应有的回报。跳槽换工作的人会很多,但是大多数人只是换了个工作环境,真正让自己苦恼的问题一个都不会少,真的很煎熬。

来点正能量吧,我认识的在这一行里边做得好的人,也经历过这个时期。他们跟那些做得不怎么好的人比起来,还是有很多不同的。他们也会抱怨,但是抱怨归抱怨,完了投入120%的精力做好自己的工作。他们会将自己的目标描绘的更清晰,达成目标的计划会更具体有效。在扩展自己技能深度广度构建完整知识体系的同时,也会主动构建人脉体系。这个时间的程序员,不需要别人来指导他,因为能够指导他的人难以寻觅。需要怎么做,全靠自己体会和实践。如果你处于这个时期,就不要盯着眼前的小困难小利益,而要想着自己的5年目标或10年目标,保持谦逊不断扩充自己完善自己。记得有句话叫做“谦逊先于伟大”,说的真好。

度过煎熬期(扩展期)的人,由于长期养成的好习惯(包括外在的生理习惯和内在的心理习惯)、高于平均水平的情商和高于平均水平的忍耐力,形成惯性的正向回馈会发展的越来越好。

凌乱地扯了这么多,我到底想说什么?初入职场拼的是文凭智商,赢得持久战的是智商情商 – 清晰的目标和坚韧的毅力。看官如果认为我说的太肤浅,嗯,我同意。古人已经告诉我们:绝知此事要躬行

第1关:批量处理 300 学习内容 参考答案 记录 评论 任务描述 相关知识 批量操作 编程要求 测试说明 任务描述 本关任务:使用batch()方法整合不同方式的请求。 相关知识 批量操作 如果我们去查看HBaseAPI的源码会发现,在上次实训中我们使用的delete、get,put这些批量操作,实际上都是调用了batch()方法。 查看put(List<Put> puts)函数源码: 我们可以发现put(List<Put> puts)方法最终还是调用的batch(final List<? extends Row> actions, final Object[] results, int rpcTimeout),其他get和delete的批量操作也同样。 所以我们如果既有get操作又有Put操作那是不是可以整合在一起呢? 答案是肯定的。 我们来看个例子: List<Row> rows = new ArrayList<>(); //上传操作 Put put = new Put(Bytes.toBytes("row1")); put.addColumn(Bytes.toBytes("data"),Bytes.toBytes("2"), Bytes.toBytes("value1")); rows.add(put); //删除操作 Delete delete = new Delete(Bytes.toBytes("row1")); delete.addColumn(Bytes.toBytes("data"),Bytes.toBytes("1")); rows.add(delete); //获取操作 Get get = new Get(Bytes.toBytes("row1")); get.addColumn(Bytes.toBytes("data"),Bytes.toBytes("2")); rows.add(get); //定义结果数组长度 Object[] results = new Object[rows.size()]; table.batch(rows, results);//这是一个同步的操作,批量操作的结果将会在操作之后放在results中 for (Object object : results) { System.out.println(object.toString()); } 上述代码delete和put操作的结果为keyvalues=NONE,即没有结果,当然如果get操作没有获取到结果也会输出keyvalues=NONE。 有结果则会输出类似这样的数据:keyvalues={row1/data:1/1543220978519/Put/vlen=7/seqid=0} 是一个Result类型的对象。 值的注意的是:最好不要将put和delete操作放在同一个批处理的请求中,因为这样会有很大的风险。在学习多线程的时候我们学过多线程三大特性之一有序性,也许会因为其他原因导致操作的实现顺序不同,这样会产生不可预料的结果,还有就是资源竞争,会使结果波动。 上述使用的是同步的方式进行批量操作,其实API还提供了一个异步执行的方法table.batchCallback(actions, results, callback): batchCallback( final List<? extends Row> actions, final Object[] results, final Batch.Callback<R> callback) 在我们需要使用异步执行批量操作,并且想要获取异步执行结果的时候可以考虑使用batchCallback()方法,Batch.Callback<R> callback就是异步执行结果的监听器。 编程要求 得来终觉,我们来实际操练吧,在右侧编辑器begin-end处编写代码补全batchOp(String tablename) 函数,参数:tablename为待操作表的表名,要求实现如下操作: 删除表中行键为row1,row2的行; 获取表中行键为row3,row10的行; 四个操作需要依照以上先后顺序,即先删除在获取row3,row10。 不需要你直接输出,只需要将批量操作的执行结果作为返回值返回即可。 测试说明 需要你先启动Hadoop和HBase,并等待HBase初始化完成。 预期输出: Row:null Row:null keyvalues=NONE keyvalues=NONE value30 value100 开始你的任务吧,祝你成功!
11-22
在HBase中,可以使用`batch()`方法整合不同类型的请求,以下是一个Java代码示例,用于删除表中行键为`row1`、`row2`的行,并获取表中行键为`row3`、`row10`的行: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class HBaseBatchExample { public static void main(String[] args) throws IOException { // 创建配置对象 Configuration config = HBaseConfiguration.create(); // 创建连接 try (Connection connection = ConnectionFactory.createConnection(config); // 获取Admin对象 Admin admin = connection.getAdmin()) { // 表名 TableName tableName = TableName.valueOf("your_table_name"); // 获取表对象 try (Table table = connection.getTable(tableName)) { // 创建一个List来存储不同类型的请求 List<Row> actions = new ArrayList<>(); // 添加删除row1和row2的请求 Delete delete1 = new Delete(Bytes.toBytes("row1")); actions.add(delete1); Delete delete2 = new Delete(Bytes.toBytes("row2")); actions.add(delete2); // 添加获取row3和row10的请求 Get get1 = new Get(Bytes.toBytes("row3")); actions.add(get1); Get get2 = new Get(Bytes.toBytes("row10")); actions.add(get2); // 执行batch请求 Object[] results = new Object[actions.size()]; table.batch(actions, results); // 处理获取行的结果 for (int i = 0; i < results.length; i++) { if (results[i] instanceof Result) { Result result = (Result) results[i]; if (!result.isEmpty()) { System.out.println("获取到行键为 " + Bytes.toString(result.getRow()) + " 的行数据"); } else { System.out.println("未找到行键为 " + Bytes.toString(actions.get(i).getRow()) + " 的行数据"); } } } } } } } ``` ### 代码说明: 1. **配置和连接**:使用`HBaseConfiguration.create()`创建配置对象,并通过`ConnectionFactory.createConnection(config)`建立与HBase的连接。 2. **获取表对象**:使用`connection.getTable(tableName)`获取指定表的对象。 3. **创建请求列表**:创建一个`List<Row>`来存储不同类型的请求,包括`Delete`和`Get`请求。 4. **添加请求**:分别添加删除`row1`、`row2`的`Delete`请求和获取`row3`、`row10`的`Get`请求到列表中。 5. **执行批量请求**:使用`table.batch(actions, results)`方法执行批量请求,并将结果存储在`results`数组中。 6. **处理结果**:遍历`results`数组,处理获取行的结果。 ### 注意事项: - 请将`"your_table_name"`替换为实际的表名。 - 确保HBase服务正常运行,并且配置信息正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值