sqoop建表_常见的sqoop操作

本文详细介绍了使用sqoop从MySQL到HDFS、Hive、HBase的数据迁移过程,包括列举表、创建Hive表、导入导出数据、增量导入等操作,并强调了在实际生产环境中应关注的分隔符、存储格式、时间类型处理等问题。同时,提到了与Hive、Impala、MySQL交互时的注意事项和错误处理策略。
摘要由CSDN通过智能技术生成

1.sqoop列举出来mysql中的表结构数据

sqoop list-tables \

> --connect jdbc:mysql://hadoop1:3306/mysql \

> --username root \

> --password root

2.列举数据库的信息

sqoop list-databases\

>--connect jdbc:mysql://hadoop1:3306/ \

>--username root \

>--password root

3.根据mysql中的表的数据创建hive中的表

sqoop create-hive-table \

--connect jdbc:mysql://hadoop1:3306/mysql \

--username root \

--password root \

--table help_keyword \

--hive-table hk   // 根据help_keyword的表数据创建hive的hk的表结构数据

4.sqoop的数据导入操作:从mysql中导入数据到hdfs中,对应的-m选项指定对应的是并行度的操作的。sqoop的导入第一步是将数据存储到hdfs上的,第二步是移动到指定的目录位置的。

sqoop import \

--connect jdbc:mysql://hadoop1:3306/mysql  \

--username root  \

--password root  \

--table help_keyword  \

-m 1

5.sqoop导入指定分隔符合和对应的hdfs目录信息

sqoop import \

--connect jdbc:mysql://hadoop1:3306/mysql  \

--username root  \

--password root  \

--table help_keyword  \

--target-dir /user/hadoop11/my_help_keyword1  \  # 指定hdfs的目录

--fields-terminated-by '\t'  \   # 指定行内的分隔符

-m 2    # 指定并行度。

6.根据指定的条件导入

sqoop import \

--connect jdbc:mysql://hadoop1:3306/mysql  \

--username root  \

--password root  \

--where "name='STRING' " \   # 指定导入数据的条件。

--table help_keyword  \

--target-dir /sqoop/hadoop11/myoutport1  \

-m 1   # 指定并行度信息

7.根据指定列和指定的条件导入

sqoop import \

--connect jdbc:mysql://hadoop1:3306/mysql  \

--username root  \

--password root  \

--columns "name" \

--where "name='STRING' " \

--table help_keyword  \

--target-dir /sqoop/hadoop11/myoutport22  \

-m 1

selct name from help_keyword where name = "string"   # 指定导入数据的列信息

8.使用自定义的sql语句导入

sqoop import \

--connect jdbc:mysql://hadoop1:3306/  \

--username root  \

--password root  \

--target-dir /user/hadoop/myimport33_1  \

--query 'select help_keyword_id,name from mysql.help_keyword where $CONDITIONS and name = "STRING"' \  # 使用自定义的sql语句导入数据,需要$CONDITIONS的选项信息。

--split-by  help_keyword_id \

--fields-terminated-by '\t'  \

-m 4   # 指定并行度。

9.sqoop将数据导入到hive中

sqoop import \

--connect jdbc:mysql://hadoop1:3306/mysql \

--username root \

--password root \

--table help_keyword \

--hive-import \  # 会创建一个和mysql表名称一样的hive表数据。help_keyword

-m1

10.数据导入到hive中并指定相关的hive的数据信息。

sqoop import \

--connect jdbc:mysql://hadoop1:3306/mysql \

--username root \

--password root \

--table help_keyword \

--fields-terminated-by "\t" \

--lines-terminated-by "\n" \

--hive-import \

--hive-overwrite \

--create-hive-table \

--delete-target-dir \

--hive-database mydb_test \

--hive-table new_help_keyword

-m 1

11.hive数据导入

sqoop import \

--connect jdbc:mysql://hadoop1:3306/mysql \

--username root \

--password root \

--table help_keyword \

--fields-terminated-by "\t" \

--lines-terminated-by "\n" \

--hive-import \   #  指定将数据导入到hive中

--hive-overwrite \   # 指定覆盖导入操作

--create-hive-table \  # 指定创建hive的表结构

--hive-table mydb_test.new_help_keyword \ # 指定表结构信息

--delete-target-dir   # 导入完成之后,删除指定的目录。

12.指定导入数据到hdfs中,导入的方式选择的是清空原有的数据的。--incremental

sqoop import \

--connect jdbc:mysql://hadoop1:3306/mysql \

--username root \

--password root \

--table help_keyword \

--target-dir /user/hadoop/myimport_add \

--incremental append \  # 指定对应的sqoop选择数据的范围。append对应的是执行主键自增的时候执行追加操作。--last-value 指定数值范围,大于这个数值的话才会执行数据导入操作的。

--check-column help_keyword_id \   # 指定需要检索的行数据信息。根据help_keyword_id执行操作

--last-value 500 \

-m1   # 指定mr的并行度,确定并行度。代表的是2个map任务。

13.执行增量导入和追加操作

sqoop import \

--connect jdbc:mysql://hadoop1:3306/mysql \

--username root \

--password root \

--table help_keyword \

--target-dir /user/hadoop/myimport_add \

--incremental append \  # 指定追加方式为append

--check-column help_keyword_id \  # 指定检查的列信息为:help_keyword_id

--last-value 500 \  # 指定从哪个限制数据开始执行导入操作

-m1  # 指定并行度

14.sqoop导入数据到hbase中

sqoop import \

--connect jdbc:mysql://hadoop1:3306/mysql \

--username root \

--password root \

--table help_keyword \ # 指定mysql的表为 help_keyword

--hbase-table new_help_keyword \ # 指定hbase的table为new_help_keyword

--column-family person \  # 指定列族为family

--hbase-row-key help_keyword_id  # 指定导入的主键为:help_keyword_id

下面展示的是一个完整的生产使用的操作:指定导入数据需要关注的顺序。

下面对应的是生产生面使用的sqoop操作。sqoop脚本通过azakan或者是oozie执行调度。此处重点展示的是生产上使用的sqoop以及可能出现的问题:

如下:

1.sqoop导入必须制定分隔符:

--fields-terminated-by '\001'

2.制定存储文件的类型,节省存储空间。stored as textfile是默认的。可以使用其他的方式存储数据,节省空间。可以指定大小压缩空间

3.可以指定每一次导入的记录数量,避免占用太多的时间的。hive底层采用的是mr程序,很浪费时间信息。需要指定导入的记录数量保证时间不能太长导致存在其他的问题。

4.时间类型的数据,在创建hive表的时候,转化为string类型执行导入操作,避免格式导致的问题出现。

5.指定了--lines-terminated-by "\n" 对应的作为换行符的信息,需要注意的是某些字段的数值中可能包含了"\n"的换行符信息。需要指定如下的字段信息。

-hive-drop-import-delims  .所以,推荐生成文件的时候使用'\001'作为分隔符进行处理,避免造成更多的问题。

6.注意,当导入的字段和hive中的关键字相同的时候,也是会报错的。

order => order1

sort => sort1

reduce => reduce1

cast => cast1

directory => directory1

7。sqoop增量数据导出对应的update-only需要处理的问题:

update-key   需要注意的是update-key需要指定的是不能进行更新的字段的。

8.impala查询hbase中的数据

将hbase中的数据映射到hive中,使用如下的语句。创建hive的外部表来进行操作。

CREATE EXTERNAL TABLE hbasestringids (id string,bool_col boolean, tinyint_col tinyint, smallint_col smallint, int_col int, bigint_col bigint, float_col float, double_col double, date_string_col string, string_col string, timestamp_col timestamp)STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITH SERDEPROPERTIES ( "hbase.columns.mapping" = ":key,bools:bool_col,ints:tinyint_col,ints:smallint_col,ints:int_col,ints:\ bigint_col,floats:float_col,floats:double_col,strings:date_string_col,\ strings:string_col,strings:timestamp_col")TBLPROPERTIES("hbase.table.name" = "hbasealltypessmall");

更新hive中的信息同步到impala中。

使用impala的jdbc编程获取数据.

hbase中的表数据信息转移到hive中的。

CREATEEXTERNALTABLEhbase.user_info (

idcardSTRING,

checkcountINT,

usernameSTRING,

useraddrSTRING,

userbirthSTRING,

usermarriedTINYINT,

usersexTINYINT,

mincheckdateSTRING,

mobileSTRING

)

STOREDBY"org.apache.hadoop.hive.hbase.HBaseStorageHandler"

WITHSERDEPROPERTIES (

"hbase.columns.mapping"="

:key,

user_info:checkCount,

user_info:userName,

user_info:userAddr,

user_info:userBirth,

user_info:userMarried,

user_info:userSex,

user_info:minCheckDate,

user_info:mobile

")

TBLPROPERTIES ("hbase.table.name"="user_info")

9.hive的数据导入到 mysql中,需要注意如下的如下的问题:

1)hive的数据存储格式必须是textfile的存储格式的。否则读取会存在问题的。

2)需要指定空值的处理方式:

/home/huser/sqoop-1.4.7/bin/sqoopexport--connect"jdbc:mysql://localhost9:3306/analysisuseUnicode=true&characterEncoding=utf-8"\

--username mysql \

--password Pass2020 \

--table tmp_dws_visit_source \

--columns days,visitSourceType,visitSource \

--input-fields-terminated-by'^A'\  # 指定输入字段的分隔符和行分隔符信息。

--input-lines-terminated-by'\n'\

--input-null-string'\\N'\     # 指定null数值的处理操作。为了避免空值时,没有数据,需要该命令

--input-null-non-string'\\N'\

--export-dir"hdfs://hadooprt:9000/user/hive/warehouse/rt1.db/dws_visit_source/everyday=2020-08-06/"\

-m 1;  # 指定mr程序中的map的个数信息

3)需要确保mysql中的表以及对应的表结构的存在的。

#!/bin/bash

everyday="2020-08-06"

sql=$(cat << !EOF

use database;

alter database analysis character set utf8 collate utf8_general_ci;

drop table dws_visit_source;

create tableifnot exists dws_visit_source(

days string,

visitSourceType string,

visitSource string

)

partitioned by (everyday string)

row format delimited

fields terminated by'^A'

lines terminated by'\n'

stored as textfile;

insert into table dws_visit_source partition(everyday='$everyday1')

select everyday,visitSourceType,visitSource

from cr_t_test08whereeveryday='$everyday'group by visitSourceType,visitSource;

exit;

!EOF)

$HIVE_HOME/bin/hive -e"$sql"

exitCode=$?

if[$exitCode-ne 0 ];then

echo"[ERROR] hive execute failed!">> tmplog.txt

exit$exitCode

fi

常见的错误和对应的错误处理信息如下:

https://nieson.blog.csdn.net/article/details/80432400?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-4.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-4.not_use_machine_learn_pai

https://blog.csdn.net/robbyo/article/details/50523998

https://blog.csdn.net/xueyao0201/article/details/83059939?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值