2014-02-21 3 views
1

Pig을 사용하여 hdfs에 데이터를로드하고 저장해야하는 시나리오가 있습니다.이 결과 (돼지 출력/부품 파일 데이터)는 두 테이블에로드해야합니다. mysqlSqoop을 사용하십시오.하나의 파트 파일 (돼지 출력)에서 두 개의 테이블로 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 

덕분에 같은 파일이있는 경우.

답변

7

아래의 솔루션에서 MySQL을 사용하고 있지만 다른 데이터베이스에도 동일하게 적용해야합니다.

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

는 MySQL의 두 테이블을 만듭니다 : HDFS에서 다음 플랫 파일 만들기

다음 다음 4 개 개의 입력 값을받는 저장 프로 시저를 만들

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 ex

$ 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 

는 이제 두 개의 테이블이 있는지 확인 포트는 그러나 테이블 이름을 지정하지 않는 대신에 위에서 만든 저장 프로 시저를 호출하는 --call 옵션을 사용하여 우리가 찾고 한 데이터 :

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에 하나 개의 플랫 파일은 데이터베이스에 여러 테이블로 내보낼 수 있습니다.

저장 프로 시저를 사용하지 않으려면 돼지를 사용하여 HDFS에 두 개의 플랫 파일 (col1, col2 및 col3, col4가있는 파일)을 만드는 것이 좋습니다. 그런 다음 각 플랫 파일에서 데이터베이스의 해당 테이블로 두 개의 sqoop 내보내기를 개별적으로 수행 할 수 있습니다.

Sqoop 내보내기 기능 --columns 옵션이지만 HDFS의 플랫 파일에 비해 데이터베이스 끝에 더 많은 열이있는 경우에만 유용합니다. 저장 프로 시저가 필요한 다른 방향으로 보인다. SQOOP-749 테이블을 지정하지 않고 저장 프로 시저를 호출하는 기능은 Sqoop 버전 1.4.3 이상에서 사용할 수 있습니다. 위 예제에서 Hadoop 2.0.0과 Sqoop 1.4.3을 사용했습니다.

0

쉽지! 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 내보내기를 각 관계에 대해 한 번씩 두 번 실행하십시오.

관련 문제