2013-01-18 1 views
0

나는 1 억 개의 행을 포함하는 큰 테이블을 가진 데이터베이스를 가지고있다. 이 데이터를 내보내고 (일부 변환 후이 테이블을 다른 테이블과 조인하고 일부 필드를 정리하는 등) 나중에 큰 텍스트 파일로 저장하여 나중에 Hadoop으로 처리하려고합니다. 대형 테이블 (100M + 행)을 텍스트 파일로 내보내는 방법은 무엇입니까?

지금까지, 나는 두 가지 시도 : 파이썬을 사용하여

  1. 를, 내가 this subquery trick를 사용하여 덩어리 (한 번에 일반적 10'000 기록)하여 테이블을 찾아, 각 행의 변환을 수행 직접 쓰기 텍스트 파일. 트릭이 도움이되지만 LIMIT은 내보내기가 진행됨에 따라 느려지고 느려집니다. 나는 이것으로 전체 테이블을 내보낼 수 없었습니다.

  2. mysql 명령 줄 도구를 사용하여 CSV 형식의 내 쿼리 결과를 텍스트 파일로 직접 출력하려고했습니다. 크기 때문에 메모리가 부족하여 추락했습니다.

나는 현재 직접 HDFS로 데이터를 가져올 수있는 도구로 Sqoop을 조사하고,하지만 난 같은 대규모 수출을 처리하는 방법을 다른 사람이 있을까요?

+7

['SELECT ... INTO OUTFILE'] (http://dev.mysql.com/doc/en/select-into.html). – eggyal

+0

가능한 복제본 http://stackoverflow.com/questions/10890163/exporting-large-mysql-table – RGO

답변

2

메모리 문제는 잘못된 데이터베이스 쿼리 machanism을 사용하는쪽으로 지적합니다.

보통 C 레벨에서 mysql_store_result()을 사용하는 것이 좋습니다. 이는 Cursor 또는 DictCursor을 갖는 것입니다. 이렇게하면 가능한 한 빨리 데이터베이스가 다시 사용 가능 해지고 클라이언트는 원하는 모든 데이터로 작업을 수행 할 수 있습니다.

그러나 데이터가 클라이언트 프로세스에 캐시되므로 대용량 데이터에는 적합하지 않습니다. 이것은 매우 많은 메모리를 소비 할 수 있습니다.

이 경우 mysql_use_result() (C)을 사용하는 것이 더 좋을 수 있습니다. SSCursor/SSDictCursor (Python) 이렇게하면 전체 결과 집합을 가져와 그 사이에 데이터베이스 연결을 사용하여 다른 작업을 수행하지 않아도됩니다. 그러나 클라이언트 프로세스에서 많은 메모리를 절약 할 수 있습니다. mysql CLI를 사용하면 -q 인수로이를 달성 할 수 있습니다.

+0

고마워, 그게 내가 찾고 있었던 바로 그 것이다. 좋은 설명! – Wookai

1

여기에 지정하지 않았기 때문에 정확히 어떤 검색어를 사용했는지 모르겠지만 한도와 오프셋을 지정한다고 가정합니다. 이는 데이터 시작시 매우 빠른 쿼리이지만 매우 느리게 진행됩니다. 당신은 ID와 같은 고유 한 열이있는 경우

, 당신은 첫 번째 N 행을 인출하지만, 쿼리 절을 수정할 수 있습니다

WHERE ID > (last_id) 

이 색인을 사용하고 수용 가능한 빠른 것입니다.

그러나, 합리적인 가져 큰 크기로, 같은 쿼리에 대해 간단하게

SELECT * FROM table 

열린 커서를 할 일반적으로 빨리해야한다.

관련 문제