2016-06-05 2 views
0

파일에서 수십억 개의 레코드를 읽는 응용 프로그램을 작성한 다음 IMPALA ODBC를 통해 Impala 테이블에 레코드를 씁니다. 이미 매개 변수odbc impala 불량 쓰기 성능

INSERT INTO table VALUES (?,?,.....,?) 

과 단일 문을 사용하거나 여러 삽입하여 삽입 쿼리를 실행하려고했다 :

INSERT INTO table VALUES (?,?,.....,?),(?,?,.....,?),...,(?,?,.....,?) 

을하지만 전나무는 매우 느립니다 각 레코드에 대한 HDFS에 하나 개의 파일을 생성; 두 번째는 더 빠른하지만 쿼리는 매우 길고 억의 기록을 위해 나는 다음과 같은 오류가 나타납니다

[Cloudera][SQLEngine] (31580) The length of the statement exceeds the maximum: 16384.

누군가가 내 응용 프로그램에 대한 언어로 C#을 사용해야합니다 점을 감안 내 문제에 대한 몇 가지 솔루션을 제공합니다.

감사합니다.

+0

당신이 레코드를 읽고있는 파일의 종류는 무엇입니까? –

+0

Csv 또는 텍스트 파일입니다. – marley1990

답변

0

이렇게하려면 다른 방법이 필요하다고 생각합니다. 나는. C#을 통해 CSV를 읽지 마십시오. 내부 값을 서버에 보냅니다. 대신 서버에 대해 파일을 읽는 명령을 실행하십시오.

시작하려면 데이터베이스에 CSV 파일의 테이블을 만듭니다. 프로그래밍 방식으로 또는 도구를 통해 수행해야하는지 결정합니다. 그런 다음 LOAD DATA 문과 함께 CSV를 새 테이블에 읽습니다. 그런 다음 INSERT INTO SELECT ... 문을 사용하여 새로 만든 테이블을 조작합니다.

의사 코드 예제 :

CREATE TABLE DataHeap(whatever the structure of your CSV is) 
LOAD DATA INPATH 'HDFS-PATH-TO-CSV-FILE' INTO TABLE DataHeap 
INSERT INTO YOUR-DESTINATION-TABLE SELECT whatever FROM DataHeap WHERE ... 
+0

고맙습니다. 제대로 작동하고 응용 프로그램의 성능이 향상됩니다. – marley1990