sqoop从一个部件文件到两个表(pig输出)

pgx2nnw8  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(246)

我有一个需要加载数据并存储到 hdfs 使用 Pig ,此结果(清管器输出/部件文件数据)应加载到中的两个表中 mysql 使用 Sqoop .
这可以由sqoop完成吗?任何其他解决方案。
例如,如果我有这样一个文件

col1 col2 col3 col4
    .... .... .... ....
    .... .... .... ....
    .... .... .... ....

I want to export col1,col2 to table table1 and col3,col4 to table table 2 of some database

提前谢谢。

ecr0jaav

ecr0jaav1#

我在下面的解决方案中使用mysql,但是其他数据库也应该使用同样的方法。
在hdfs上创建以下平面文件:

$ hadoop fs -cat sqoop_export
W1, X1, Y1, Z1
W2, X2, Y2, Z2
W3, X3, Y3, Z3

在mysql中创建两个表:

mysql> create table A (col1 VARCHAR(20), col2 VARCHAR(20));
Query OK, 0 rows affected (0.08 sec)

mysql> create table B (col3 VARCHAR(20), col4 VARCHAR(20));
Query OK, 0 rows affected (0.01 sec)

然后创建一个存储过程,该过程接受四个输入值,然后将前两个值插入第一个表,最后两个值插入第二个表:

mysql> delimiter //
mysql> CREATE PROCEDURE insert_two_tables (IN c1 VARCHAR(20), IN c2 VARCHAR(20), IN c3 VARCHAR(20), IN c4 VARCHAR(20)) BEGIN INSERT INTO A(col1, col2) VALUES(c1, c2); INSERT INTO B(col3, col4) VALUES(c3, c4); END//
Query OK, 0 rows affected (0.04 sec)

现在使用sqoop export,但不指定表名,而是使用--call选项调用上面创建的存储过程:

$ sqoop export --connect jdbc:mysql://localhost/sqoop_export --username xyz --password test --call insert_two_tables --export-dir sqoop_export

导出过程成功完成:

14/03/24 17:52:53 INFO mapred.JobClient:     Physical memory (bytes) snapshot=668643328
14/03/24 17:52:53 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=7584153600
14/03/24 17:52:53 INFO mapred.JobClient:     Total committed heap usage (bytes)=1175584768
14/03/24 17:52:53 INFO mapreduce.ExportJobBase: Transferred 691 bytes in 16.8329 seconds (41.0506 bytes/sec)
14/03/24 17:52:53 INFO mapreduce.ExportJobBase: Exported 3 records

现在验证这两个表是否有我们要查找的数据:

mysql> select * from A;
+------+------+
| col1 | col2 |
+------+------+
| W3   |  X3  |
| W2   |  X2  |
| W1   |  X1  |
+------+------+
3 rows in set (0.00 sec)

mysql> select * from B;
+------+------+
| col3 | col4 |
+------+------+
|  Y3  |  Z3  |
|  Y2  |  Z2  |
|  Y1  |  Z1  |
+------+------+
3 rows in set (0.00 sec)

所以使用存储过程,hdfs上的一个平面文件可以导出到数据库上的多个表中。
如果您不想使用存储过程,那么另一种方法是使用pig在hdfs上创建两个平面文件—一个有col1,col2,另一个有col3,col4。然后,您可以对每个平面文件分别执行两个sqoop导出,将其导出到数据库中相应的表中。
sqoop export features--columns选项,但这仅在数据库端相对于hdfs上的平面文件有更多列时才有用。另一方面,似乎需要存储过程。根据sqoop-749,在sqoop版本1.4.3和更高版本中,可以在不指定表的情况下调用存储过程。我在上面的例子中使用了hadoop2.0.0和sqoop1.4.3。

hlswsv35

hlswsv352#

容易的!只需使用pig将数据拆分为两个关系:

-- given A:
A = 
col1 col2 col3 col4
.... .... .... ....
.... .... .... ....

-- split into two relations:
Acols1_and_2 = FOREACH A GENERATE col1, col2;
Acols3_and_4 = FOREACH A GENERATE col3, col4;

-- store those relations in HDFS
...

然后运行sqoop导出两次,每个关系一次。

相关问题