SQL & Python Study

[D+19][ํ”„๋กœ์ ํŠธ #1-1] CSV ํŒŒ์ผ ์—…๋กœ๋“œ ์—๋Ÿฌ(Error occurred during batch insert) ๋ณธ๋ฌธ

๐Ÿšต‍โ™€๏ธTeam Project/๋งˆ์ผ€ํŒ…์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๋ถ„์„

[D+19][ํ”„๋กœ์ ํŠธ #1-1] CSV ํŒŒ์ผ ์—…๋กœ๋“œ ์—๋Ÿฌ(Error occurred during batch insert)

๊น€์ˆฎ์—‰ 2024. 5. 18. 01:42

 

๐Ÿ”ฅ ๋“œ๋””์–ด ๋ฐ์ดํ„ฐ๋ถ„์„ ๋ถ€ํŠธ์บ ํ”„ ์ฒซ ๋ฒˆ์งธ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค๐Ÿ”ฅ

์ฒซ ํ”„๋กœ์ ํŠธ ์ฃผ์ œ๋Š” <๋งˆ์ผ€ํŒ… ์„ฑ๊ณผ ์ธก์ •์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๋ถ„์„ - Hotel booking demand>๋กœ ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. 

๋ฐ์ดํ„ฐ ๋ถ„์„์ด ๋งŽ์ด ํ™œ์šฉ๋˜๋Š” ์„œ๋น„์Šค ๊ธฐํš ํ˜น์€ ๋งˆ์ผ€ํŒ… ๋ถ„์•ผ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ์—ˆ๊ฑฐ๋“ ์š”!

 

์บ๊ธ€์˜ Hotel booking demand ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋Š”๋ฐ์š”. 

๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด DBeaver ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋งˆ์ฃผํ•˜๊ฒŒ ๋˜์–ด 

์–ด๋–ป๊ฒŒ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™”๋Š”์ง€ ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค :)  


โš ๏ธ ์˜ค๋Š˜ ๋งˆ์ฃผํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ โš ๏ธ

Error occurred during batch insert
(you can disable batch insert in order to skip particular rows).

์ด์œ :
Can't parse numeric value [NA] using formatter

 

 

"Error occurred during batch insert"

์œ„ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด„ ์‚ฝ์ž…(batch insert)ํ•˜๋Š” ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ํ•ด์š”. 

ํ•ด๋‹น ์˜ค๋ฅ˜๋Š” ์•„๋ž˜ ์›์ธ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ๊ตฌ์ฒด์ ์ธ ์›์ธ์€ ํ•˜๋‹จ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! 

 

โ‘  ๋ฐ์ดํ„ฐ ํ˜•์‹์˜ ๋ฌธ์ œ 

โ‘ก NULL ๊ฐ’ ๋ฌธ์ œ 

โ‘ข ์ค‘๋ณตํ‚ค ๋ฌธ์ œ

โ‘ฃ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ๊ธธ์ด๊ฐ€ ํ—ˆ์šฉ์น˜๋ฅผ ์ดˆ๊ณผํ•œ ๊ฒฝ์šฐ  

โ‘ค ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•œ ๊ฒฝ์šฐ ๋“ฑ๋“ฑ. 

 

์ด์œ : Can't parse numeric value [NA] using formatter

์ œ ๊ฒฝ์šฐ์—๋Š” CSV ํŒŒ์ผ์— ์ˆซ์žํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’[NA]์„ MYSQL๋กœ ๊ฐ€์ ธ์™€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

์ด๋Ÿด ๋• CSV ํŒŒ์ผ์—์„œ 'NA' ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜,

์ ์ ˆํ•œ ๊ฐ’(ex. NA → NULL)์œผ๋กœ ๋Œ€์ฒดํ•ด ์ค„ ์ˆ˜ ์žˆ๊ณ ,

์•„์˜ˆ ์ž˜๋ชป๋œ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. 

 

์ €๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์–ด์„œ

NA๋ฅผ NULL ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

ํŒŒ์ด์ฌ์„ ํ™œ์šฉํ•ด์„œ Na์„ NaN์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๊ณ ,

์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ํŒŒ์ผ์„ ์ œ ์ปดํ“จํ„ฐ์— ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด ์ €์žฅํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. 

ํ•ด๋‹น ํŒŒ์ผ์€ MYSQL์— ์ •์ƒ์ ์œผ๋กœ ์ž˜ ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค :) 

 

import pandas as pd

# CSV ํŒŒ์ผ ์ฝ๊ธฐ
input_path = "C:/Users/_____/Downloads/hotel_bookings.csv"
df = pd.read_csv(input_path)

# 'NA'๋ฅผ NaN์œผ๋กœ ๋ณ€ํ™˜
df.replace('NA', pd.NA, inplace=True)

# CSV ํŒŒ์ผ๋กœ ์ €์žฅ
output_path = "C:/Users/_____/Downloads/processed_hotel_booking_file.csv"
df.to_csv(output_path, index=False)

print(f"File saved to {output_path}")

 

์ฐธ๊ณ  ์‚ฌํ•ญ. 

  • ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” ์šฐํด๋ฆญํ•˜์—ฌ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์–ด์š”.
    ์ฒ˜์Œ ๋ณต์‚ฌํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” \ (๋ฐฑ์Šฌ๋ž˜์‹œ)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ,
    /(์Šฌ๋ž˜์‹œ)๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ์˜ค๋ฅ˜ ์—†์ด CSV ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
  • CSV ํŒŒ์ผ ์ €์žฅ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ ๋””๋ ‰ํ† ๋ฆฌ์—๋งŒ ์ €์žฅ๋˜์–ด ์ปดํ“จํ„ฐ์—์„œ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์–ด์š”. 
    ๋งŒ์•ฝ ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ „์ฒ˜๋ฆฌ์™€ EDA, ์‹œ๊ฐํ™”๊นŒ์ง€ ์ญ‰- ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ๋ณ„๋„๋กœ ์ €์žฅํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ, 
    ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์— ์ง์ ‘ ์—…๋กœ๋“œํ• ๊ฑฐ๋ผ๋ฉด ์ €์žฅ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด ์ฃผ์„ธ์š”. 
  • ์œ„ ์ฝ”๋“œ์—์„œ ๊ตฌ์ฒด์ ์ธ ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” _____๋กœ ๋Œ€์ฒดํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.