将表从多个数据库导入Hadoop和Union

时间:2015-12-11 10:10:00

标签: hadoop sqoop

我有这个具体情况:

SQL Server中有年度数据库,其名称类似于" FOOXXYY"其中XXYY表示会计年度。现在我想拿一张特定的桌子" bar"从所有这些数据库中,将它连接到配置单元中的单个表中并将其存储到HDFS中。

最好和最快的方法是什么?

1 个答案:

答案 0 :(得分:1)

您需要创建数据库,创建分区表,添加分区,运行4个不同的sqoop命令以连接到每个数据库并将数据加载到分区中。以下是示例代码段。

创建数据库,然后像这样分区表;

CREATE TABLE `order_items`(
  `order_item_id` int, 
  `order_item_order_id` int, 
  `order_item_order_date` string, 
  `order_item_product_id` int, 
  `order_item_quantity` smallint, 
  `order_item_subtotal` float, 
  `order_item_product_price` float)
PARTITIONED BY ( 
  `order_month` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '|';

然后,您可以使用以下命令添加分区:

alter table order_items add partition (order_month=201301);
alter table order_items add partition (order_month=201302);

创建表后,您可以运行describe formatted order_items。它将给出表的路径,您可以在hive中使用dfs -ls命令进行验证。

From describe formatted
Location:               hdfs://sandbox.hortonworks.com:8020/apps/hive/warehouse/retail_ods.db/order_items

dfs -ls /apps/hive/warehouse/retail_ods.db/order_items

您将获得2个目录,捕获路径。

到目前为止,您每年都有表格和分区(根据您的情况而定)。现在,您可以使用sqoop import命令为每个数据库从表中查询并复制到相应的分区。

您可以找到示例sqoop命令here。您甚至可以将查询作为sqoop导入命令的一部分传递(Google sqoop用户指南)。

sqoop import \
  --connect "jdbc:mysql://sandbox.hortonworks.com:3306/retail_db" \
  --username=retail_dba \
  --password=hadoop \
  --table order_items \
  --target-dir /apps/hive/warehouse/retail_ods.db/order_items/order_month=201301 \
  --append \
  --fields-terminated-by '|' \
  --lines-terminated-by '\n' \
  --outdir java_files