我有这个具体情况:
SQL Server中有年度数据库,其名称类似于" FOOXXYY"其中XXYY表示会计年度。现在我想拿一张特定的桌子" bar"从所有这些数据库中,将它连接到配置单元中的单个表中并将其存储到HDFS中。
最好和最快的方法是什么?
答案 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