03 增量导入
  HDFS文件系统是不允许对记录进行修改的,只能对文件进行删除,或者追加新文件到目录中。但Mysql数据中的增、删、改是基本的操作,因此导入的数据,可能一会儿过期了。
  从这儿也可以看出,并非所有数据都适合导入到HDFS,通常是日志数据或者非常大的需要统计分析的数据。通常不太大的表,也建议直接完整导入,因为本身导入速度已经够快了,千万级别的数据,也只是几分钟而已。
  如果不考虑数据的修改问题,只考虑数据的增加问题,可以使用append模式导入。如果需要考虑数据修改,则使用lastmodified的模式。
  增量的方式,需要指定以下几个参数:
  --check-column
  filed_name
  --incremental
  append|lastmodified
  --last-value
  value
  check_colume:配置检查增量的字段,通常是id字段,或者时间字段
  incremental: 增量的方式,追加或者后修改,追加从上一次id开始,只追加大于这个id的数据,通常用于日志数据,或者数据不常更新的数据。后修改,需要本身在Mysql里面,数据每次更新,都更新维护一个时间字段。在此,表示从指定的时间开始,大于这个时间的数据都是更新过的,都要导入
  last-value: 指定了上一次的id值或者上一次的时间
  04 映射到hive
  导入到HDFS中的数据,要进行统计分析,甚至会需要对多个文档进行关联分析,还是有不便之处,此时可以再使用Hive来进行数据关联。
  首先,需要在Hive中建立表结构,只选择性的建立导入的数据字段,比如导入了id和name两个字段,则Hive表也只建立这两个字段。
  另外,好通过external关键字指定建立外部表,这样Hive只管理表的元数据,真实的数据还是由HDFS来存储和手工进行更新。即使删除了Hive中的表,数据依然会存在于HDFS中,还可以另做它用。
  建表,要指定字段的数据格式,通常只需要用四数据来替换Mysql的数据:
  string ==> 替换char,varchar
  int ==> 替换int
  float ==> 替换float
  timestamp ==> 替换datetime
  另外,还需要指定存储格式,字符分隔符和分区等,常用的一个建表语句如:
  CREATE external TABLE your_table (
  id int,
  name string
  )
  PARTITIONED BY (pdyear string)
  ROW FORMAT DELIMITED fields terminated by '01'
  STORED AS TEXTFILE
  LOCATION '/path/your_table';
  上面指定了一个分区pdyear,字段分隔符为’01′,存储成TEXTFILE格式,数据文件的目录为/path/your_table(从MySQL导入到HDFS的目录)。
  如果导入的数据,配置了分区,即如下目录结构:
  /path/your_table/pdyear=2015
  /path/your_table/pdyear=2016
  则建立表后,表里面没有对应上数据,需要添加分区到hive表中,在hive中执行以下语句:
  alter table your_table add partition (pdyear='2015') location '/path/your_table/pdyear=2015';
  alter table your_table add partition (pdyear='2016') location '/path/your_table/pdyear=2016';
  完成上面的操作后,即可以在Hive中进行查询和测试,查看是否有数据。Hive的hql语法,源于mysql的语法,只是对部分细节支持不一样,因此可能需要调试一下。
  05 HDFS导出到MySQL
  在Hive中进行了一系列的复杂统计分析后,后的结论可能还是需要存储到Mysql中,那么可以在Hive语句中,将分析结果导出到HDFS中存储起来,后再使用Sqoop将HDFS的文件导入到MySQL表中,方便业务使用。
  导出的配置示例:
export
--connect
jdbc:mysql://1.2.3.4/db_name
--username
your_username
--password
your_passwd
--table
your_table
--input-null-string
'N'
--update-mode
allowinsert
--update-key
id
--export-dir
/path/your_table/
--columns
id,name
--input-fields-terminated-by
'01'
  参数说明:
  export:指令说明是导出
  update-mode:allowinsert,配置了,使用更新模式,即如果Mysql中已经有数据了,则进行更新,如果没有,则插入。判断的字段使用update-key参数配置,需要这个字段是索引的字段。
  input-null-string:Hive中,导出的NULL为字符N,要还原到Mysql中,依然为MyQL的Null的话,需要使用这个配置,指定NULL的字符串为’N’
  另外,导出的时候,如果Mysql表中有自动增长的主键字段,可以留空,生成数据的时候会自动填充。
  06 猴戏开始
  将MySQL中的数据导入到HDFS中,又将HDFS中的数据建立了到Hive表的映射。至此,通过Sqoop工具作为SQL与NoSQL的数据桥梁,将传统的数据也存入到NoSQL中来了,有了数据,便是开始。