반응형
 
다음과 같이 CSV 파일을 BigQuery 로딩할 때
 
bq load -F " " \
jerryjg-kr-ce-api:test.page_access \
large_csv.txt \
log_dt:string,page_no:integer,page_value:string,psc_url:string,referer:string,user_agent:string,user_ip:string,gd_no:string,sid:integer,affiliate_contract_cd:string,reg_dt:string,tracking_session_id:string,svc_nation_cd:string,inflow_referer:string,gate_flag:string,ref_page_no:string,flowpath_no:string,flowpath_value:string,ref_page_value:string,landing_page_no:integer,landing_page_value:string,gdlc_cd:string,gdmc_cd:string,gdsc_cd:string,login_id:string,cust_age:integer,cust_gender:string,sell_cust_no:string,site_id:string,landing_flowpath_no:string,landing_flowpath_value:string,cust_no:integer,dev_cd:string,app_no:integer,pv_yn:string,add_info2:string,page_context_id:string,client_side_access_yn:string,lang_cd:string
 
 
다음과 같은 에러가 나면서 로딩에 실패하는 경우가 있다. 
 
Upload complete.
Waiting on bqjob_r4d5161fe7efea7dd_0000015ffc077c7b_1 ... (0s) Current status: DONE   
BigQuery error in load operation: Error processing job
'api-project-249965614499:bqjob_r4d5161fe7efea7dd_0000015ffc077c7b_1': CSV table encountered too many errors, giving up.
Rows: 1; errors: 1.
Failure details:
- file-00000000: CSV table references column position 14, but line
starting at position:0 contains only 14 columns.
 
 
에러 메시지의 내용은 15번째 컬럼(0부터 시작)이 정의되어 있지만, 실제로 CSV 파일에는 14개의 컬럼만 정의되어 있어 로딩에 실패했다는 의미이다.
이런 경우는 실제로 필드 수를 잘못 지정해서 발생하는 경우도 있지만 CSV 파일이 잘못 포맷팅(예: Quotation 없이 컴머가 포함)되어 발생하는 경우가 많다.
트러블 슈팅을 하려면 컬럼들을 하나씩 지워가면서 어떤 필드에 문제가 있는지 찾기가 쉽지 않은데,
다음과 같이 --autodetect 옵션을 사용해서 일부 데이터를 로딩하면 쉽게 문제를 찾아낼 가능성이 높다.
 
head -n 100 large_csv.txt > 100.txt
 
bq load -F "," --null_marker "\N" --autodetect \
jerryjg-kr-ce-api:test.page_access \
100.txt
 
 
위와 같이 하면 컴머가 잘못 들어가 있더라도 상관 없이 BigQuery가 자동으로 컬럼들을 추정하여 데이터를 로딩한다.
그러면 BigQuery Web UI에 들어가서 문제가 되는 데이터를 쉽게 찾아낼 수 있다.
이 문제의 경우 웹서버 로그에서 user_agent 부분의 데이터에 컴머가 포함되어 문제가 되었다는 것을 알 수 있다.
 
 
이런 경우에는 CSV를 생성할 때 Quotation(")으로 데이터를 둘러쌓게 하여 Export를 해서 로딩을 해야 한다.
 
 
 
Posted by Hey Jerry
,