(至少)有两个选项可以使用Sqoop将表从Oracle导入Hive。
第一个选项
创建配置单元表工具使用基于先前导入到 HDFS 的数据库表或计划导入的数据库表的表定义填充 Hive 元存储。在下面的示例中,我们将创建表emps
$ sqoop create-hive-table
--connect jdbc:mysql://localhost/dualcore
--username training
--password training
--table employees
--hive-table emps
然后,执行导入到emps表中
$ sqoop import
--connect jdbc:mysql://localhost/dualcore
--username training
--password training
--m 1
--target-dir /queryresult
--hive-table emps
--hive-import
https://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_literal_sqoop_create_hive_table_literal
第二个选项(看起来更有效)
使用命令 --hive-import它:
- 在 Hive(元存储)中创建表
- 将数据从RDBMS导入到HDFS中的表目录
例:
$ sqoop import
--connect jdbc:mysql://localhost/dualcore
--username training
--password training
--m 1
--target-dir /queryresult
--table employees
--hive-import
这两个选项中哪一个更好?
即使第二个选项看起来更有效,但在某些情况下也是不可能的。
我不得不面对的一个情况是,当你需要在Hive中创建一个外部表时。由于 Sqoop 不支持创建 Hive 外部表,因此需要另一种解决方法。
题外话 - Hive 中的内部表与外部表
蜂巢中的外部表
(将数据存储在HDFS上)
什么是外部表
- 外部表将文件存储在 HDFS 服务器上,但表不是 完全链接到源文件。
- 如果删除外部表,该文件仍保留在 HDFS 上 服务器。
- 文件和表链接存在,但只读。
- 例如my_test,如果您在 HIVE 使用 HIVE-QL 并将表链接到文件"flat_file.txt",然后 从HIVE中删除"my_test",这不会删除"flat_file.txt" 来自HDFS。
- 任何有权访问HDFS的人都可以访问外部表文件。 文件结构,因此需要在 HDFS 中管理安全性 文件/文件夹级别。
- 元数据在主节点上维护并删除外部表 从HIVE中,仅删除元数据而不是数据/文件。
在以下情况下使用外部表:
- 想要管理 Hare 外部的数据。因此,数据文件由不锁定文件的现有程序读取和处理,例如,您计划使用 ETL 工具来加载/合并数据文件等。
- 想要将最新信息加载到表中,但仍希望 出于监管/法律目的,将旧数据集保留在 HDFS 上的文件中。
-
不打算从另一个表模式创建表,例如 将表1创建为(从表2中选择*)
-
即使在 DROP 之后,数据也需要保留在底层位置 桌子。如果要指向多个架构(表或 视图),或者如果您正在遍历各种数据集 可能的架构。
-
您希望使用自定义位置,例如 ASV。
-
Hive 不应该拥有数据和控制设置、目录等,你有 另一个程序或进程将执行这些操作。
蜂巢中的内部表
(将数据存储在HDFS上,但存储在一种限制区域)
什么是内部表
-
内部表文件的安全性仅通过 Hare 控制。例如 tbl_batting只能通过 HDFS 内部帐户访问:
r = 读取 w = 写入 x = 执行 -
删除表会从主节点中删除元数据和数据,并且 分别是HDFS
- 安全性需要在HIVE中进行管理,可能在架构中 级别(取决于组织与组织之间)。HDFS 安全性已失效 在这种情况下的范围。
在以下情况下使用内部表:
-
想要临时存储数据。
-
希望使用 HIVE 来管理表和数据的生命周期。
来源:
- https://www.linkedin.com/pulse/internal-external-tables-hadoop-hive-big-data-island-amandeep-modgil
- https://blogs.msdn.microsoft.com/cindygross/2013/02/05/hdinsight-hive-internal-and-external-tables-intro/
解决方案(使用解决方法在 Sqoop 的 Hive 中创建外部表)
需要从 Oracle 导入表的示例以创建一个 avro 文件,该文件将用于生成配置单元表。然后,您将整个表从oracle导入hdfs。
1 生成 Avro 文件
sqoop import --connect jdbc:oracle:thin:@//url:port/database \ --用户名my_user --密码 my_password -m 1 --获取大小 10 \ --表 table_to_import \ --列 columns_to_import \ --创建配置单元表 --配置单元表 dummy_table \ --as-avrodatafile --target-dir hdfs:///user/my_user/dummytab/
2 在本地生成架构
avro-tools getschema hdfs://urlhadoop:port/user/my_user/dummytab/part-m-00000.avro
schematab.avsc
3 将模式移回 hdfs
hdfs dfs -copyFromLocal schematab.avsc/user/my_user/schemas
4 在 Hive 中创建表
Hive -e "CREATE EXTERNAL TABLE MYHIVETABLE ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 存储为 INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 输出格式 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' LOCATION "hdfs:///user/my_user/tables/"特利属性 ('avro.schema.url'='hdfs:///user/my_user/schemas/schematab.avsc');">
5 导入所有数据
sqoop import --connect jdbc:oracle:thin:@//url:port/database \ --用户名my_user --密码 my_password -m 1 \ --表 table_to_import \ --列 columns_to_import \ --hive-table MyHiveTable \ --as-avrodatafile --target-dir hdfs:///user/my_user/tables/--append
来源: http://wpcertification.blogspot.com/2015/05/importing-data-from-sqoop-into-hive.html?_sm_au_=iVV10VW0vW1Z7Z42