Title: BigQuery offline store loses array data when pushing features with list types · Issue #5845 · feast-dev/feast · GitHub
Open Graph Title: BigQuery offline store loses array data when pushing features with list types · Issue #5845 · feast-dev/feast
X Title: BigQuery offline store loses array data when pushing features with list types · Issue #5845 · feast-dev/feast
Description: Summary When using store.push() with PushMode.OFFLINE or PushMode.ONLINE_AND_OFFLINE, array/list type columns (e.g., STRING_LIST) are written as empty arrays [] to BigQuery, even though the data is correct in the DataFrame and PyArrow ta...
Open Graph Description: Summary When using store.push() with PushMode.OFFLINE or PushMode.ONLINE_AND_OFFLINE, array/list type columns (e.g., STRING_LIST) are written as empty arrays [] to BigQuery, even though the data is...
X Description: Summary When using store.push() with PushMode.OFFLINE or PushMode.ONLINE_AND_OFFLINE, array/list type columns (e.g., STRING_LIST) are written as empty arrays [] to BigQuery, even though the data is...
Opengraph URL: https://github.com/feast-dev/feast/issues/5845
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"BigQuery offline store loses array data when pushing features with list types","articleBody":"\n\n\n## Summary\n\n When using `store.push()` with `PushMode.OFFLINE` or `PushMode.ONLINE_AND_OFFLINE`, array/list type columns (e.g., STRING_LIST) are written as empty arrays [] to BigQuery, even though the data is correct in the DataFrame and PyArrow table.\n\n## Root Cause\n\n The BigQuery LoadJobConfig in offline_write_batch() is missing parquet_options.enable_list_inference = True. Without this option, BigQuery's parquet loader doesn't correctly interpret PyArrow's list format.\n\n Related issue: https://github.com/googleapis/google-cloud-python/issues/15705#issuecomment-2541921785\n\n## Steps to Reproduce\n```\n from feast import FeatureStore\n from feast.data_source import PushMode\n import pandas as pd\n from datetime import datetime, timezone\n\n # Assuming feature view with STRING_LIST field is configured\n data = {\n \"entity_id\": \"test_123\",\n \"tags\": [\"category_a\", \"category_b\"], # STRING_LIST type\n \"event_time\": datetime.now(timezone.utc),\n }\n\n df = pd.DataFrame([data])\n store = FeatureStore(repo_path=\".\")\n store.push(\"my_push_source\", df, to=PushMode.ONLINE_AND_OFFLINE)\n\n # Result in BigQuery: tags = [] (empty array)\n # Expected: tags = [\"category_a\", \"category_b\"]\n```\n## Expected Behavior\n\n Array data should be correctly written to BigQuery with values preserved.\n\n## Actual Behavior\n\n Array columns are written as empty arrays [] in BigQuery, while the online store receives correct data.\n\n## Proposed Fix\n\n In feast/infra/offline_stores/bigquery.py, update offline_write_batch() (~line 428):\n```\n @staticmethod\n def offline_write_batch(\n config: RepoConfig,\n feature_view: FeatureView,\n table: pyarrow.Table,\n progress: Optional[Callable[[int], Any]],\n ):\n # ... existing code ...\n\n parquet_options = bigquery.ParquetOptions()\n parquet_options.enable_list_inference = True\n\n job_config = bigquery.LoadJobConfig(\n source_format=bigquery.SourceFormat.PARQUET,\n schema=arrow_schema_to_bq_schema(pa_schema),\n create_disposition=config.offline_store.table_create_disposition,\n write_disposition=\"WRITE_APPEND\",\n parquet_options=parquet_options, # Add this line\n )\n # ... rest of code ...\n```\n\n## Environment\n\n - Feast version: 0.58.0\n - Python version: 3.12\n - BigQuery client version: (latest)\n\n## Additional Context\n\n - Online store (PostgreSQL) receives array data correctly\n - The PyArrow table contains correct array data before parquet write\n - Parquet file contains correct data when read locally\n - Only BigQuery load loses the array content\n - Using load_table_from_json instead of parquet works correctly\n - Adding enable_list_inference=True to ParquetOptions fixes the issue","author":{"url":"https://github.com/max36067","@type":"Person","name":"max36067"},"datePublished":"2026-01-13T07:55:03.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/5845/feast/issues/5845"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:62f532b6-d5e9-2def-e270-ec1cc2a243cc |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 844A:3FF0AC:1684D92:1F2D179:6A4DF423 |
| html-safe-nonce | 8f5f517b102702b30f238a5e553465c79ae150ed509ffb2ba7bc4fa4e37d0b64 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4NDRBOjNGRjBBQzoxNjg0RDkyOjFGMkQxNzk6NkE0REY0MjMiLCJ2aXNpdG9yX2lkIjoiMzY3ODA0MjE0MjQ2MDk5ODY5MSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 1ff1cb30974c90552316b1c3ab7281f166538e2463edd730ea6f6b9c80c1b1a4 |
| hovercard-subject-tag | issue:3807611943 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/feast-dev/feast/5845/issue_layout |
| twitter:image | https://opengraph.githubassets.com/9ce6242fbf062c8045e54523b3ae3b37be1eb19d17a7d9425e2a01bc3de9fce8/feast-dev/feast/issues/5845 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/9ce6242fbf062c8045e54523b3ae3b37be1eb19d17a7d9425e2a01bc3de9fce8/feast-dev/feast/issues/5845 |
| og:image:alt | Summary When using store.push() with PushMode.OFFLINE or PushMode.ONLINE_AND_OFFLINE, array/list type columns (e.g., STRING_LIST) are written as empty arrays [] to BigQuery, even though the data is... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | max36067 |
| hostname | github.com |
| expected-hostname | github.com |
| None | 5818716c93c6a2925b815402541a32814e43a7b1261c322b0c2df75224289566 |
| turbo-cache-control | no-preview |
| go-import | github.com/feast-dev/feast git https://github.com/feast-dev/feast.git |
| octolytics-dimension-user_id | 57027613 |
| octolytics-dimension-user_login | feast-dev |
| octolytics-dimension-repository_id | 161133770 |
| octolytics-dimension-repository_nwo | feast-dev/feast |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 161133770 |
| octolytics-dimension-repository_network_root_nwo | feast-dev/feast |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | f4bb89367ca678f057d79b1abc45d6675b1bd5b2 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width