美文网首页hivePython&Django大数据
使用sqoop import从mysql往hive含分区表中导入

使用sqoop import从mysql往hive含分区表中导入

作者: 阿乐_822e | 来源:发表于2020-12-31 17:02 被阅读0次

    先看下面这条语句,它实现的功能是将特定日期的数据从mysql表中直接导入hive

    $ sqoop import \
    --connect jdbc:mysql://192.168.xx.xx:3306/db_name?useSSL=false \
    --username xxx --password xxxxxx  \
    --query "select d.id, d.callsign, d.sobt from t_flight_baseinfo d where d.id is not null and d.sobt >= '2020-12-27' and \$CONDITIONS" \
    --target-dir /user/hive/warehouse/datapros.db/t_flight_baseinfo/dt=2020-12-27 \
    --delete-target-dir   --fields-terminated-by '\t'  --split-by d.id \
    --hive-import   --hive-overwrite  --m 2 --direct \
    --hive-database datapros --hive-table t_flight_baseinfo \
    --hive-partition-key dt --hive-partition-value 2020-12-27 
    

    以下对命令中的参数作简单说明:

    --connect /--username / --password

    很明显,这是mysql数据库的连接字符串

    --query

    这是选取数据的查询语句。这里需要注意的是:

    • 每条查询语句必须要添加where条件;
    • 末尾还要加上'$CONDITIONS'这个占位符;
    • 当使用双引号包裹住这个查询语句时,'$CONDITIONS'前要加上转义符变为'\$CONDITIONS',而如果使用单引号来包裹,就不用加转义符!

    --target-dir

    mysql数据导入HDFS后的目标路径(也即hive表的“数据文件”地址)

    --delete-target-dir

    导入前是否先删除target-dir中定义的目录(如果存在的话)
    说明:这个参数比较重要!一般情况下,同一条导入语句,第一次执行时,要不要这个参数没有关系,但如果是多次执行同一条导入语句,而又没有提前手工删除目标目录时,就出出现“Output directory hdfs://hadoop:9820/somepath/${target_dir} already exists”,因此,这个参数一定要加上

    --direct

    使用直接导入模式,可以提高导入速度

    --m 2

    指定并行执行导入数据任务的map进程个数

    --hive-database / --hive-table t_flight_baseinfo

    指定导入到hive中的目标数据库与数据表名称

    --hive-partition-key / --hive-partition-value

    指定hive数据表的分区信息

    --hive-overwrite

    指定hive中的目标表可以被多次覆盖写入

    --hive-import / --create-hive-table

    1、create-hive-table:在hive中创建目标表(不管它是不是已经存在),如果目标表已经存在,就会给出“AlreadyExistsException(message:Table XXX already exists”出错信息;
    2、hive-import : hive-import在执行时,会自动生成一个建表的sql语句,当hive中不存在表时,它即自动创建目标表与存储目录,然后再导入数据;

    mysql往hive带分区表中导入实践

    1、在实践中发现,当需要创建带分区的表时,如果使用--create-hive-table参数,则每次都会提示表已存在错误(这个表确实是存在);不过,这个错误提示不影响命令的正确执行;
    2、但是,如果不带上这个参数,如果之前这个分区已存在 ,则会出现在hive表中能查到这个分区,但是它实际的存储目录已经被删除(delete-target-dir参数的效果), hive-import会认为此分区已存在,就停止从mysql中往hdfs中导入数据,最后提示导入的数据numFiles=0,相当于分区表被清空;
    3、如果不想每次都看到表已存在的错误提示,可以在执行导入命令之前,先执行一下 hive -e "alter table db_name.tb_name drop partition(partition_key='partition_value');"),先删除这个分区,这样hive-import就会创建hive表分区与重建存储目录。当然,这时候就不用加--create-hive-table参数了。

    相关文章

      网友评论

        本文标题:使用sqoop import从mysql往hive含分区表中导入

        本文链接:https://www.haomeiwen.com/subject/vltroktx.html