使用avro格式将表从oracle导入hive的最佳选项是什么?

dly7yett  于 2021-06-03  发布在  Sqoop
关注(0)|答案(1)|浏览(311)

使用sqoop将表从oracle导入配置单元(至少)有两个选项。

第一种选择

“创建配置单元表”工具使用基于先前导入到hdfs的数据库表或计划导入的数据库表的表定义来填充配置单元元存储。在下面的示例中,我们创建表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,该命令:
在配置单元(元存储)中创建表
将数据从rdbms导入hdfs中表的目录
例子:

$ sqoop import \
 --connect jdbc:mysql://localhost/dualcore \
 --username training \
 --password training \
 --m 1 \
 --target-dir /queryresult \
 --table employees \
 --hive-import

这两个选项中哪一个更好?

vs3odd8k

vs3odd8k1#

即使第二种选择看起来更有效率,也有一些情况下是不可能的。
我不得不面对的一个情况是,您需要在配置单元中创建一个外部表。由于sqoop不支持创建配置单元外部表,因此需要另一种解决方法。

离题-配置单元中的内部表与外部表

配置单元中的外部表

(在hdfs上存储数据)
什么是外部表
外部表在hdfs服务器上存储文件,但表没有完全链接到源文件。
如果删除了外部表,则该文件仍保留在hdfs服务器上。
文件和表链接在那里,但是是只读的。
例如,如果您使用配置单元ql在配置单元中创建一个名为“my\u test”的外部表,并将该表链接到文件“flat\u file.txt”,然后从配置单元中删除“my\u test”,则不会从hdfs中删除“flat\u file.txt”。
任何有权访问hdfs文件结构的人都可以访问外部表文件,因此需要在hdfs文件/文件夹级别管理安全性。
元数据是在主节点上维护的,从配置单元中删除一个外部表时,只删除元数据而不删除数据/文件。
如果您:
希望在配置单元外管理数据。因此,数据文件由不锁定文件的现有程序读取和处理,例如,您计划使用etl工具加载/合并数据文件等。
希望将最新信息加载到表中,但仍希望将旧数据集保留在hdfs上的文件中,以用于法规/法律目的。
不打算从另一个表架构创建表,例如,create table1 as(select*from table2)
即使在删除表之后,数据也需要保留在基础位置。如果您将多个模式(表或视图)指向一个数据集,或者迭代各种可能的模式,则可以应用这种方法。
您希望使用自定义位置,如asv。
配置单元不应该拥有数据和控制设置、目录等,您有另一个程序或进程来做这些事情。

配置单元中的内部表

(在hdfs上存储数据,但在某种限制区域中)
什么是内部表
内部表文件安全仅通过配置单元控制。e、 g.只有通过hdfs内部帐户才能访问tbl\U batting:
r=读取w=写入x=执行
删除表将分别从masternode和hdfs中删除元数据和数据
安全性需要在hive中进行管理,可能是在模式级别(取决于组织到组织)。在本例中,hdfs安全性超出范围。
如果您:
希望临时存储数据。
希望使用配置单元来管理表和数据的生命周期。
资料来源:
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在配置单元中创建外部表的解决方案)

有必要从oracle导入一个表的示例以创建avro文件,该文件将用于生成配置单元表。然后将整个表从oracle导入hdfs。

1生成avro文件

sqoop导入--连接jdbc:oracle:薄:@//url:port/database --username my\u user--password my\u password-m1--fetch size 10 --表\u to \u import --列\u to \u import --创建配置单元表--配置单元表dummy \u table --作为avrodatafile--target dir hdfs:///user/my\u user/dummytab/

2生成本地模式

avro工具getschemahdfs://urlhadoop:port/user/my\u user/dummytab/part-m-00000.avro
架构.avsc

3将模式移回hdfs

hdfs dfs-copyfromlocal schematab.avsc/user/my\u user/schemas

4在配置单元中创建表

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'outputformat'org.apache.hadoop.hive.ql.io.avro.avrocontaineroutputformat'location'hdfs:///user/my_user/tables/'tblproperties('avro.schema.url'='hdfs:///user/my_user/schemas/schematab.avsc');“

5导入所有数据

sqoop导入--连接jdbc:oracle:薄:@//url:port/database --username my\u user--password my\u password-m 1 --表\u to \u import --列\u to \u import --配置单元表myhivetable --作为avrodatafile--target dir hdfs:///user/my\u user/tables/--追加
资料来源:http://wpcertification.blogspot.com/2015/05/importing-data-from-sqoop-into-hive.html?sm_au=ivv10vw0vw1z7z42

相关问题