hadoop中的job.setOutputKeyClass与job.setMapOutputKeyClass


 初学mr时,觉得没什么,但是学了一段时间,重新复习时发现程序中mr程序中一般都会有

hadoop中的job.setOutputKeyClass(theClass)与job.setOutputValueClass(theClass),

但是有的程序处理以上两个外还有job.setMapOutputKeyClass(theClass)与job.setMapOu

tputValueClass(Text.class),一直没弄懂是怎么回事,网上查了下,原来当mapper与reducer

的输出类型一致时可以用 job.setOutputKeyClass(theClass)与job.setOutputValueClass

(theClass)这两个进行配置就行,但是当mapper用于reducer两个的输出类型不一致的时候就需

要分别进行配置了。


mysql对事务的支持


起因:因为只是需要编写一个接口,无需使用框架,但是又要求对数据库的操作支持事务,所以直接使用mysql自带的事务进行处理

mysql自带对事务的支持,但是他默认是关闭的,需要我们手动打开,打开mysql的事务支持,只需要一下几步:

第一步,mysql表格类型默认是MyISAM,这个类型是不支持事务的,我们需要将他改成INNODB,语句如下:

  

ALTER TABLE `表名` ENGINE = INNODB; 
--ENGINE 可以用type代替
-- 创建表时指定表类型的方法
CREATE TABLE `表名` (
`id` int(11) NOT NULL auto_increment,
`tel` varchar(11) default NULL,
) ENGINE=MYISAM;
--也可以在建表时直接指定表类

第二步,打开事务

 

$db->query('begin'); // $db需要事先创建,我就不写
接着,我们找之前的平常的方式修改表中的结果,我们会发现,我们的sql虽然执行成功了,但是mysql表中的数据并没有改变,这是因为,我们还没有提交事务

第三步,提交事务

if($res){ // $res 为前面sql语句返回的执行结果
  $db->query("COMMIT");
  // 提交事务
}else{
  $db->query("ROLLBACK")
 // 数据回滚
}
$db->query("END");

//   结束事务操作
执行完这条语句后,我们再去查看表结构,如果sql语句没问题的话,表中的数据已经改变了,如果sql有问题,我们会发现不仅sql错误的那条语句没执行成功,sql正确的语句也没有执行成功,这就是mysql的事务了


使用json_decode无法解析json


在接入合作方接口时,遇到一个json无法解析出来代码如下:

  

<?php
        $res='{"resultcode":007,"resMsg":"!&!lB5:aHb-\/5hb\\Frx;%\/&>:]u&;=>foFBW>&!\"2&()o\\MN$i&J\'w9@"}';// 模拟合作方穿过的json数据 
        $date = json_decode($res,true);
        var_dump($date);
?>

  由于无法解析json数据导致接口无法接入,到网上查了一些资料,都是说一些php配置无效,使用单引号,没有转义之类的,后来仔细检测,发现我这边都不存在这样的问题,最后找出了真正原因,原来是因为resultcode后面的参数导致,json_decode在解析json时会检测json中的类型,由于resultcode后面的参数没有加双号,json_decode会按int类型检测,但是以0开头又不属于int类型,所以会传回一个null,导致我这边无法获取到json数据。

  正确的形式,应该如下:

  

<?php
        $res='{"resultcode":007,"resMsg":"!&!lB5:aHb-\/5hb\\Frx;%\/&>:]u&;=>foFBW>&!\"2&()o\\MN$i&J\'w9@"}';// 模拟合作方穿过的json数据 
        $date = json_decode($res,true);
        var_dump($date);
?>

总的来说是合作方那边回传的json问题,这个问题在别的语言解析时也可能会遇到,今天贴出来,希望能帮助大家。


使用jd-gui+javassist修改已编译好的class文件


1.原因:因为公司代码管理不当导致源码丢失,只好已编译好的class文件进行修改

2.首先先在myeclipse中新建java项目并导入javassist

3.将需要修改的文件放到指定文件夹下

4..在项目中添加以下代码

package dtj;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

public class MyTest {

///////入口启动函数

       public static void main(String[] args) throws Exception {

       //这个是得到反编译的池

      ClassPool pool = ClassPool.getDefault();
      
      pool.insertClassPath("E:/dtj") ;
      
    //取得需要反编译修改的文件,注意是完整路径

      CtClass cc1 = pool.get("SmsSender");

      try {
          
          
          cc1.setName("CTCC_SmsSender");
          //取得需要修改的方法

         // CtMethod method = cc1.getDeclaredMethod("a");

         //插入修改项,我们让他直接返回(注意:根据方法的具体返回值返回,因为这个方法返回值是void,所以直接return;)

         // method.insertBefore("{if(true) return ;}");

          //写入保存

          cc1.writeFile();

      } catch (NotFoundException e) {

          e.printStackTrace();

     }

} 
}

注:jd-gui和javassist的下载地址
下载


linux基本命令


网上关于linux命令详解挺多的,我这边会把一些常用的命令收集整理一下贴出来,供大家查看(注:只会简单提及一下,具体的操作请查看相关资料)

  1.添加:a.文件 touch 文件名

      b.文件夹 mkdir 文件夹

      c.用户 adduser 新用户(添加后用"passwd 新用户"的方式修改密码,应当在root用户下添加)

  2.删除:a.文件 rm -f 文件名

     b.文件夹 rm -rf 文件夹

     c.用户 userdel 用户名(使用“userdel -r 用户名” 删除用户及其删除其家目录及文件)

  3.修改:使用vi命令进入文件并修改内容后使用":wq"或":x"保存修改文件内容,若没有修改使用":q"退出,若修改但不打算保存使用":q!"退出

  4.查询: 使用cat 文件名 查看

      使用tail 文件名 查看

  5.清屏:clear (很常用的命令)

  6.切换目录: cd 目录名(只使用cd会切换到当前用户的家目录下)

  7.将文件压缩成包:tar -zcvf 包名.tar.gz 文件夹

  8.解压压缩包:tar -xzvf 包名.包名后缀

  9.查看进程: ps -auwx(后面加上"grep xxx"即可进行过滤,xxx为你要查询的关键字)

  10.杀死进程:kill -9 进程号(进程号可用第9个命令查询,进程号为查出来的第二列)

  11.查看文件夹下所有文件:ls -i(一般使用ls即可)

  12.修改文件文件夹权限 chmod +权限号 文件或文件夹(+改为-即为取消某个权限,=为使用这个权限覆盖其他权限)

  13.向文件中追加数据 echo "追加的数据" | cat >> 文件

  14.添加程序对文件的读写权限

    sudo chmod -R 777 /home/user

    注:表示将整个/home/user目录与其中的文件和子目录的权限都设置为rwxrwxrwx