You could write a Python script with the BigQuery client library for a one-time load. Or you could map the columns and click Run.
No credit card. 14 days. Cancel in one click.
Quick answer: Add the CSV as a connection, then build a Data Sync: pick the CSV as the source and your BigQuery table as the target. Map columns, choose Insert, Update or Upsert, and run it, or save it as a recurring job if the file gets refreshed regularly. Pipelines tier.
A vendor sends you a spreadsheet. A one-off export from another system needs to land in your warehouse. Someone in finance has a file that has to get into BigQuery before Monday's report runs. None of this needs a script, it needs a mapped load you can also repeat if the file shows up again next week.
A vendor's weekly inventory file needs to land in a staging table, replacing stale rows for SKUs that already exist:
-- target table CREATE TABLE IF NOT EXISTS `my-gcp-project.staging.vendor_inventory` ( sku STRING, quantity INT64, updated_at TIMESTAMP );
Map the CSV's SKU, Qty and LastUpdated columns to sku, quantity and updated_at, set MODE to Upsert, and MATCH ON to sku. Save it as a job if this file arrives every week, and the same sync just re-runs against the new file.
Dry Run shows you exactly what would write before anything does. After a real run, check row counts in BigQuery against the source file, and look at the job's history for any listed errors, usually a type mismatch between a text column and a numeric target.
| If you see | Fix |
|---|---|
| Choose at least one key field | Pick a MATCH ON column for Update or Upsert modes. |
| Duplicate key values in source | Check the CSV for repeated IDs before syncing; dedupe upstream. |
| Job fails on write | Give the BigQuery connection BigQuery Data Editor, not just Data Viewer. |
If the same vendor sends a fresh file every week at a predictable path, saving the sync as a job and re-pointing the file connection each time beats rebuilding the mapping from scratch. The field mapping stays the same; only the underlying file changes. If the file's structure itself changes column by column, that's a sign to rebuild the mapping rather than trust the old one.
Matching row counts between the source file and the target table is the fastest confirmation a load went cleanly:
SELECT COUNT(*) AS row_count FROM my_gcp_project.staging.vendor_inventory;
If that number doesn't match the CSV's row count minus its header row, check the job history for skipped rows before trusting the table.
If a vendor adds or renames a column in a later file, the existing mapping won't automatically pick it up, it will just ignore the new column or fail on a missing one it expected. Treat a structural change in the source file as a reason to revisit the mapping, not something to assume still works.
If next week's file has the identical column structure, you can point the same file connection at the new file and re-run the existing sync without rebuilding the mapping. It's only a structural change, a renamed or reordered column, that calls for revisiting it.
For a file in the hundreds of thousands of rows or more, splitting it before loading can be faster than one giant sync, particularly if you're troubleshooting a single bad row somewhere in the middle. A smaller batch that fails is much quicker to debug than one that fails halfway through a much larger load.
See also: Integrations Sync Databricks to BigQuery Load an Excel File into BigQuery..
No, you map each column manually or with AI Map. Names don't need to match, only the mapping does.
Yes, save the sync as a job and set a schedule. If the file itself changes location each week, you'll need to update the file connection before each run.
BigQuery Data Editor on the service account or Google login used for the connection, in addition to Job User.
Practical limits come from BigQuery load limits and your Mac's available memory for large files; very large files may be better split before loading.
14-day free trial, no card. Map it once, run it whenever the file shows up.
No credit card. 14 days. Cancel in one click.