หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
บทความนี้อธิบายวิธีการแก้ไขปัญหาความล้มเหลวในการนําเข้าในรูปแบบการนําเข้า T-SQL
การนําเข้าไปยังคลังสินค้าโดยใช้ COPY INTO, BULK INSERT, OPENROWSET ฟังก์ชันใน CTAS, INSERT, UPDATEและ MERGE คําสั่งอาจล้มเหลวได้ด้วยเหตุผลหลายประการ ค่าไฟล์ต้นฉบับอาจไม่ตรงกับ Schema ตาราง ค่าที่ต้องการอาจขาดหายไป ตัวเลือกการนําเข้าอาจถูกกําหนดค่าไม่ถูกต้อง
คู่มือการแก้ไขปัญหานี้ใช้ข้อมูลการวินิจฉัยแถวที่ถูกปฏิเสธเพื่อแก้ไขความล้มเหลว บันทึกข้อผิดพลาดระดับแถว และตรวจสอบแถวที่ถูกปฏิเสธด้วยข้อมูลเมตาของข้อผิดพลาด
เมื่อตรวจสอบไฟล์ข้อผิดพลาดที่สร้างขึ้นโดย COPY INTO และคําสั่งการนําเข้าอื่นๆ คุณจะสามารถระบุได้อย่างชัดเจนว่าแถวใดไม่สามารถนําเข้าได้และเพราะเหตุใด ข้อมูลนี้ช่วยให้คุณระบุปัญหาด้านคุณภาพของข้อมูลหรือปรับการตั้งค่าการนําเข้า แก้ไขข้อมูลต้นทาง และเรียกใช้การโหลดซ้ําด้วยความมั่นใจ
สำคัญ
วิธีการเหล่านี้ใช้กับการนําเข้าไฟล์ CSV หรือ JSONL โดยใช้คําสั่ง Transact-SQL (COPY INTO, BULK INSERTและ DML with OPENROWSET function) เท่านั้น ไฟล์เอาต์พุตแถวที่ถูกปฏิเสธจะไม่ถูกสร้างขึ้นสําหรับเครื่องมือการนําเข้าภายนอก (เช่น ไปป์ไลน์ ) ไฟล์ Parquet หรือเมื่อนําเข้าข้อมูลจากปลายทางการวิเคราะห์ SQL
สร้างตารางเป้าหมาย
ก่อนเรียกใช้คําสั่งการนําเข้า ให้สร้างตารางปลายทางที่มีประเภทและ NOT NULL ข้อจํากัดที่เข้มงวด เพื่อให้คุณตรวจพบปัญหาการแปลงและคุณภาพของข้อมูลตั้งแต่เนิ่นๆ
ในพื้นที่ทํางานคลังสินค้าของคุณ ให้เปิดคลังสินค้าของคุณ
บนแท็บ หน้าแรก ให้เลือก แบบสอบถาม SQL ใหม่
เรียกใช้คําสั่งต่อไปนี้:
DROP TABLE IF EXISTS dbo.TaxiTrips; GO CREATE TABLE dbo.TaxiTrips ( vendorID int NOT NULL, startLat float NOT NULL, startLon float NOT NULL, endLat float NOT NULL, endLon float NOT NULL, passengerCount int NOT NULL, tripDistance float NOT NULL, fareAmount float NOT NULL, mtaTax float NOT NULL, totalAmount float NOT NULL );
คุณใช้วิธีการที่รองรับได้หลายวิธี รวมถึงการนําเข้าด้วย COPY INTO หรือการนําเข้าด้วย Transact-SQL เลือกวิธีการนําเข้าที่เหมาะกับแหล่งข้อมูล รูปแบบ และข้อกําหนดระบบอัตโนมัติของคุณมากที่สุด ตัวอย่าง COPY INTO ต่อไปนี้แสดงรูปแบบการนําเข้าทั่วไปสําหรับการโหลดข้อมูลจากไฟล์ภายนอกลงในตาราง
COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/'
WITH ( FILE_TYPE = 'CSV' );
คําสั่งนี้อาจล้มเหลวในการนําเข้าข้อมูลหากไฟล์ต้นฉบับไม่ตรงกับ Schema ตารางปลายทาง สาเหตุที่พบบ่อย ได้แก่ จํานวนคอลัมน์ที่ไม่ตรงกัน ชนิดข้อมูลที่เข้ากันไม่ได้ หรือค่าที่ไม่สามารถจัดเก็บไว้ในตารางเป้าหมายได้ ถ้าการนําเข้าพบค่าที่ไม่สามารถแปลงเป็น Schema ปลายทางได้ คําสั่งจะส่งกลับข้อผิดพลาดที่คล้ายกับต่อไปนี้:
Msg 13812, Level 16, State 1, Line 2
Bulk load data conversion error (type mismatch or invalid character for the specified codepage)
for row starting at byte offset 0, column 1 (vendorID).
Underlying data description:
file 'https://....blob.core.windows.net/Files/yellow/tripdata.csv'.
ข้อผิดพลาดนี้บ่งชี้ว่าไม่สามารถแปลงแถวอย่างน้อยหนึ่งแถวเป็นชนิดคอลัมน์ปลายทางได้
ตรวจสอบข้อผิดพลาดด้วย MAXERRORS และ ERRORFILE
ใช้ตัวเลือกต่อไปนี้เพื่อนําเข้าสินค้าต่อไปเมื่อจํานวนข้อผิดพลาดระดับแถวต่ํากว่าเกณฑ์ที่กําหนดไว้ และเพื่อจัดเก็บรายละเอียดการวินิจฉัยในตําแหน่งที่ระบุ
-
MAXERRORSตั้งค่าจํานวนสูงสุดของความล้มเหลวระดับแถวที่ยอมรับได้ระหว่างการนําเข้า -
ERRORFILEระบุตําแหน่งที่ฐานข้อมูลเขียนแถวที่ถูกปฏิเสธและรายละเอียดข้อผิดพลาด
COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/'
WITH (
FILE_TYPE = 'CSV',
MAXERRORS = 10,
ERRORFILE = 'https://{storage-path}.blob.core.windows.net/Files/yellow/'
);
สำคัญ
กําหนดค่า ERRORFILE ภายใต้ตําแหน่งที่เก็บข้อมูลเดียวกันกับที่ใช้สําหรับการอ่านไฟล์ต้นฉบับ ไม่ใช่ในบัญชีที่เก็บข้อมูลอื่น ข้อมูลประจําตัวที่ใช้ในการเข้าถึงข้อมูลต้นทางต้องมีสิทธิ์ในการสร้างโฟลเดอร์และไฟล์ในเส้นทางข้อผิดพลาดที่กําหนดค่าไว้
การดําเนินการโหลดจะสําเร็จก็ต่อเมื่อจํานวนแถวที่ถูกปฏิเสธต่ํากว่าMAXERRORS เมื่อบันทึกข้อผิดพลาด การดําเนินการนําเข้าจะเขียน:
-
error.jsonlสําหรับการวินิจฉัยแบบมีโครงสร้าง -
row.csvสําหรับแถวต้นทางที่ถูกปฏิเสธ
ค้นหาและสืบค้นแถวที่ถูกปฏิเสธ
ฐานข้อมูลจะเขียนข้อมูลข้อผิดพลาดไปยังลําดับชั้นของโฟลเดอร์ที่มีโครงสร้างภายใต้ตําแหน่งที่ตั้งของข้อผิดพลาดที่กําหนดค่าไว้ โฟลเดอร์เหล่านี้ช่วยให้คุณติดตามการดําเนินการที่เฉพาะเจาะจงและเชื่อมโยงการวินิจฉัยกับคําสั่งการนําเข้าหนึ่งคําสั่ง:
ERRORFILE/
+-- _rejectedrows/
+-- <timestamp>/
+-- <statement_id>/
+-- error.jsonl
+-- row.csv or rows.jsonl
ใช้เพื่อ OPENROWSET อ่านการ error.jsonl วินิจฉัยที่มีโครงสร้าง เพื่อระบุว่าค่าใดล้มเหลว คอลัมน์ปลายทางใดได้รับผลกระทบ และที่มาของแถวที่ล้มเหลว
SELECT *
FROM OPENROWSET(
BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/error.jsonl'
);
โดยทั่วไปชุดผลลัพธ์จะประกอบด้วยหนึ่งแถวต่อเรกคอร์ดที่ถูกปฏิเสธ ตัวอย่างเช่น:
| Error | คอลัมน์ | ColumnName | มูลค่า | เป็นเอาต์พุต | ไฟล์ | ตําแหน่งแถวข้อผิดพลาด |
|---|---|---|---|---|---|---|
| ข้อผิดพลาดในการแปลงข้อมูล | 1 | vendorID |
vendorID |
1 | https://.../yellow/tripdata.csv |
0 |
| NULL ในคอลัมน์ที่ไม่สามารถ null ได้ | 1 | vendorID |
โมฆะ | 1 | https://.../yellow/ytripdata.csv |
399 |
| ข้อผิดพลาดในการแปลงข้อมูล | 6 | passengerCount |
ไม่ระบุ | 1 | https://.../yellow/yellow_tripdata.csv |
519 |
error.jsonlไฟล์มีออบเจ็กต์ JSON หนึ่งรายการต่อบรรทัด แต่ละวัตถุมีคุณสมบัติที่แสดงในตารางก่อนหน้า ตารางต่อไปนี้อธิบายรายละเอียดของคุณสมบัติแต่ละรายการ
| คอลัมน์ | คำอธิบาย |
|---|---|
Error |
แสดงข้อความแสดงข้อผิดพลาดที่อธิบายว่าเหตุใดค่าจึงถูกปฏิเสธระหว่างการนําเข้า |
Column |
ระบุดัชนีของคอลัมน์ในไฟล์ CSV ต้นฉบับที่มีค่าที่ไม่สามารถนําเข้าได้ การจัดทําดัชนีคอลัมน์เริ่มต้นที่ 1 คอลัมน์แรก |
ColumnName |
ระบุชื่อของคอลัมน์ตารางปลายทางที่ไม่สามารถจัดเก็บค่าได้ |
Value |
ค่าต้นทางที่ไม่สามารถแปลงหรือตรวจสอบความถูกต้องได้ |
IsOutputted |
ระบุว่าแถวจากไฟล์ต้นฉบับที่มีข้อผิดพลาดที่รายงานถูกเขียนไปยังไฟล์เอาต์พุตแถวที่ถูกปฏิเสธด้วย (row.csv หรือ row.jsonl) หรือไม่ ค่า 1 (หรือ true ในไฟล์ JSONL) หมายถึงแถวถูกเขียนใน error.csvและค่า 0 (หรือ false ในไฟล์ JSONL) หมายความว่าไม่ใช่ |
File |
ระบุไฟล์ต้นฉบับที่แถวที่ถูกปฏิเสธเป็นต้นทาง ค่านี้ช่วยให้คุณติดตามข้อมูลที่ถูกปฏิเสธกลับไปยังไฟล์อินพุตต้นฉบับเพื่อการตรวจสอบ |
ErrorRowLocation |
ตําแหน่งออฟเซ็ตไบต์ในไฟล์ต้นฉบับที่เกิดความล้มเหลว |
ตรวจทานแถวที่ถูกปฏิเสธ
หลังจากตรวจทานข้อมูลการวินิจฉัยที่มีโครงสร้างแล้ว คุณจะตรวจสอบข้อมูลต้นฉบับที่ฐานข้อมูลนําเข้าไม่ได้ เอาต์พุตแถวที่ถูกปฏิเสธประกอบด้วยสําเนาของเร็กคอร์ดต้นทาง ซึ่งเก็บรักษาไว้ตรงตามที่ปรากฏในไฟล์อินพุต การวินิจฉัยแถวที่ถูกปฏิเสธจะสร้างไฟล์ที่มีเฉพาะเรกคอร์ดที่นําเข้าล้มเหลว:
- หากคุณนําเข้าไฟล์ CSV โดยใช้
COPY INTO (FILE_TYPE = 'CSV')เอาต์พุตที่ถูกปฏิเสธจะรวมrow.csvไฟล์ ไฟล์นี้ตรงกับโครงสร้างไฟล์ต้นฉบับและมีแถว CSV ต้นฉบับที่มีค่าไม่ถูกต้อง - หากคุณนําเข้าไฟล์ JSONL โดยใช้
OPENROWSET(FORMAT = 'JSONL')เอาต์พุตที่ถูกปฏิเสธจะมีrow.jsonlไฟล์ ไฟล์นี้รักษาออบเจ็กต์ JSON ดั้งเดิมที่ทําให้เกิดความล้มเหลวในการนําเข้า
ใช้แฟ้มเหล่านี้เพื่อตรวจสอบสาเหตุของข้อผิดพลาด เช่น ค่าที่มีรูปแบบไม่ถูกต้อง ค่าที่ไม่คาดคิด NULL หรือแถวส่วนหัวที่ถูกแยกวิเคราะห์เป็นข้อมูลอย่างไม่ถูกต้อง
SELECT *
FROM OPENROWSET(
BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/row.csv'
);
row.csvสคีมาตรงกับรูปร่าง CSV ต้นทาง และมีเฉพาะแถวที่นําเข้าไม่สําเร็จ
ตัวอย่างเอาต์พุตแถวที่ถูกปฏิเสธ:
C1 |
C2 |
C3 |
C4 |
C5 |
C6 |
C7 |
C8 |
C9 |
C10 |
|---|---|---|---|---|---|---|---|---|---|
vendorID |
startLat |
startLon |
endLat |
endLon |
passengerCount |
tripDistance |
fareAmount |
mtaTax |
totalAmount |
| โมฆะ | 40.7484 | -73.9857 | 40.7549 | -73.9840 | 2 | 1.40 | 9.00 น. | 0.50 | 13.20 |
| 1 | 40.7216 | -74.0047 | 40.7359 | -74.0036 | ไม่ระบุ | 1.80 | 11.00 | 0.50 | 15.90 |
จากข้อมูลการวินิจฉัยนี้ คุณจะระบุปัญหาการนําเข้าต่อไปนี้ได้
- แถวส่วนหัวในไฟล์ต้นฉบับถูกแยกวิเคราะห์อย่างผิดพลาดเป็นแถวข้อมูล เมื่อต้องการแก้ไข
COPY INTOใบแจ้งยอดควรใช้ตัวเลือกFIRSTROW = 2 - แถวในแฟ้มต้นฉบับสําหรับ
vendorIDคอลัมน์ (C1) มีค่าNULLแต่คอลัมน์ที่สอดคล้องกันในตารางปลายทางTaxiTripsถูกกําหนดเป็นNOT NULL - แถวในแฟ้มต้นฉบับของ
passengerCountคอลัมน์มีค่า (N/A) ที่ไม่ถูกต้องซึ่งไม่สามารถแปลงเป็นคอลัมน์ int ปลายทางได้
Note
กระบวนการเดียวกันนี้ใช้เมื่อคุณตรวจสอบแถวที่ถูกปฏิเสธจากอินพุต JSONL ใช้ row.jsonl ไฟล์เพื่อตรวจสอบระเบียนที่ถูกปฏิเสธ
แก้ไขปัญหาการนําเข้าและนําเข้าข้อมูลอีกครั้ง
หลังจากระบุสาเหตุของการนําเข้าข้อมูลล้มเหลวแล้ว ให้แก้ไขปัญหาและนําเข้าข้อมูลที่ได้รับผลกระทบอีกครั้ง แนวทางการแก้ไขขึ้นอยู่กับที่มาของข้อผิดพลาด
แก้ไข Schema ตารางปลายทาง
ถ้าข้อมูลต้นฉบับไม่สอดคล้องกับ Schema ตารางปลายทาง ให้อัปเดตข้อกําหนดของตาราง การแก้ไขทั่วไป ได้แก่ การเปลี่ยนชนิดข้อมูลคอลัมน์หรือการลบข้อจํากัดที่จํากัด เช่นNOT NULL
ในบางสถานการณ์ คุณอาจต้องวางและสร้างตารางปลายทางใหม่ก่อนที่จะนําเข้าข้อมูลอีกครั้ง
แก้ไขข้อมูลต้นฉบับและนําเข้าไฟล์อีกครั้ง
หากการนําเข้าล้มเหลวเนื่องจากค่าที่ไม่ถูกต้องหรือไม่สอดคล้องกันในไฟล์ต้นฉบับ ให้แก้ไขค่าเหล่านั้นและนําเข้าข้อมูลอีกครั้ง ตัวอย่างเช่น แทนที่ค่าตัวยึด เช่น N/A ด้วยค่าว่างหรือค่าเริ่มต้นที่ถูกต้อง
COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/tripdata_corrected.csv'
WITH ( FILE_TYPE = 'CSV' );
เมื่อนําเข้าข้อมูลที่แก้ไขแล้วอีกครั้ง ให้ใช้เส้นทางไฟล์ที่ชัดเจนซึ่งชี้ไปยังไฟล์ใหม่ที่มีเฉพาะข้อมูลที่แก้ไขแล้ว แทนที่จะใช้เส้นทางโฟลเดอร์ที่อ้างอิงไฟล์ต้นฉบับ วิธีการนี้ป้องกันการนําเข้าแถวที่โหลดสําเร็จก่อนหน้านี้อีกครั้ง และหลีกเลี่ยงข้อมูลที่ซ้ํากัน
ประมวลผลแถวที่ถูกปฏิเสธอีกครั้งโดยใช้ตารางการจัดเตรียม
คุณสามารถโหลดแถวที่ถูกปฏิเสธลงในตารางการจัดเตรียม แก้ไขข้อมูลโดยใช้คําสั่งการแก้ไขข้อมูล Transact-SQL แล้วนําเข้าแถวที่แก้ไขแล้วอีกครั้ง
คําสั่งต่อไปนี้ CREATE TABLE AS SELECT โหลดแถวที่ถูกปฏิเสธลงในตารางสําหรับการประมวลผลเพิ่มเติม:
CREATE TABLE TaxiTrip_RejectedRows AS
SELECT *
FROM OPENROWSET(
BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/row.csv'
);
หลังจากที่คุณแก้ไขข้อมูลแล้ว ให้แทรกแถวที่ล้างลงในตารางปลายทาง