René's URL Explorer Experiment


Title: fix: Handle array of strings columns in Athena materialization by alan-gauthier-jt · Pull Request #6324 · feast-dev/feast · GitHub

Open Graph Title: fix: Handle array of strings columns in Athena materialization by alan-gauthier-jt · Pull Request #6324 · feast-dev/feast

X Title: fix: Handle array of strings columns in Athena materialization by alan-gauthier-jt · Pull Request #6324 · feast-dev/feast

Description: What this PR does / why we need it Fixes two related bugs that cause TypeError and ValueError when materializing feature views with array-typed columns (e.g. Array(String), Array(Int64)) using the Athena offline store. Arrow/Athena deserializes array columns as numpy.ndarray (object dtype) instead of plain Python lists. This breaks two code paths in type_map.py: _convert_scalar_values_to_proto: pd.isnull(ndarray) returns an array of bools, and not raises ValueError: The truth value of an empty array is ambiguous. → Already guarded by _is_array_like in newer Feast versions; no change needed here. _convert_list_values_to_proto (generic list path): proto_type(val=ndarray) passes the raw numpy array to the protobuf constructor, which only accepts Python lists → TypeError: bad argument type for built-in operation. Additionally, Arrow nullable columns can yield None elements inside the ndarray, which protobuf repeated fields also reject. _validate_collection_item_types: None elements inside an ndarray failed the type(item) in valid_types check before reaching the sanitization step. Changes feast/type_map.py Add module-level _LIST_NONE_DEFAULTS dict mapping each list ValueType to a type-appropriate zero/empty default value used to replace None elements: STRING_LIST, UUID_LIST, TIME_UUID_LIST, DECIMAL_LIST → "" BYTES_LIST → b"" INT32_LIST, INT64_LIST → 0 FLOAT_LIST, DOUBLE_LIST → 0.0 BOOL_LIST → False UNIX_TIMESTAMP_LIST → NULL_TIMESTAMP_INT_VALUE Add module-level _sanitize_list_value(value, feast_value_type) helper that: Calls .tolist() on any numpy.ndarray to produce a plain Python list (empty ndarray → None, treated as a missing row) Replaces None elements with the type-appropriate default from _LIST_NONE_DEFAULTS Is a no-op for plain Python lists without None and for scalar values Apply sanitization upfront in _convert_list_values_to_proto: both values and sample are normalised via _sanitize_list_value before any type-checking or proto conversion, removing the need for per-path ndarray handling. Remove the old _to_proto_safe_list / _DROP_NONE / _LIST_TYPE_NONE_REPLACEMENT module-level helpers, which have been superseded by the above. Skip None elements in _validate_collection_item_types — None entries are valid in nullable Arrow columns and are sanitized upstream; raising a TypeError on them before that point was incorrect. Testing Added TestArrowArrayStringListMaterialization in sdk/python/tests/unit/test_type_map.py covering: Test Scenario test_sanitize_list_value_ndarray ndarray → plain list test_sanitize_list_value_empty_ndarray empty ndarray → None (missing row) test_sanitize_list_value_ndarray_with_none None elements in STRING_LIST replaced with "" test_sanitize_list_value_plain_list plain list passthrough test_sanitize_list_value_plain_list_with_none None in plain STRING_LIST list replaced with "" test_sanitize_list_value_numeric_none_replaced None in numeric/bool lists replaced with zero default test_sanitize_list_value_bytes_none_replaced None in BYTES_LIST replaced with b"" test_sanitize_list_value_scalar_passthrough non-list, non-ndarray values unchanged test_string_list_from_ndarray full round-trip via python_values_to_proto_values test_string_list_from_empty_ndarray empty ndarray no longer raises ValueError test_string_list_from_ndarray_with_none_elements None in ndarray no longer raises TypeError test_string_list_null_row_produces_empty_proto None rows produce empty ProtoValue test_mixed_batch_simulating_athena_chunk full simulation of a failing Athena materialization batch pytest sdk/python/tests/unit/test_type_map.py::TestArrowArrayStringListMaterialization -v Which issues this PR fixes Fixes #6325 Does this PR introduce a user-facing change? Yes — materialization of array-typed feature columns from Athena no longer fails with TypeError or ValueError when a batch contains empty arrays, None rows, or None elements inside arrays. None elements inside an array are now stored as the type-appropriate zero/empty value (e.g. "" for strings, 0 for integers). Previously: TypeError: bad argument type for built-in operation ValueError: The truth value of an empty array is ambiguous After this fix: Materialization completes successfully. None elements inside arrays are replaced with type-appropriate defaults.

Open Graph Description: What this PR does / why we need it Fixes two related bugs that cause TypeError and ValueError when materializing feature views with array-typed columns (e.g. Array(String), Array(Int64)) using the ...

X Description: What this PR does / why we need it Fixes two related bugs that cause TypeError and ValueError when materializing feature views with array-typed columns (e.g. Array(String), Array(Int64)) using the ...

Opengraph URL: https://github.com/feast-dev/feast/pull/6324

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:2741521c-cebc-7ff6-70a8-df03aefe06a1
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idB466:3D7639:ACCED7:F9DD9A:6A4E4623
html-safe-nonceffc05a54b3d7883a10446444f488c8899fd348f01293c7de794216a9c33652d4
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCNDY2OjNENzYzOTpBQ0NFRDc6RjlERDlBOjZBNEU0NjIzIiwidmlzaXRvcl9pZCI6IjgxNDQ3MTU4NDAwNDM3NjMyMzUiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmacaa86c53ea351f1c438e385e15fe195e154c6fe843b9cd394fab41449a1d3d9f5
hovercard-subject-tagpull_request:3577975099
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/feast-dev/feast/pull/6324/files
twitter:imagehttps://avatars.githubusercontent.com/u/106987123?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/106987123?s=400&v=4
og:image:altWhat this PR does / why we need it Fixes two related bugs that cause TypeError and ValueError when materializing feature views with array-typed columns (e.g. Array(String), Array(Int64)) using the ...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None030096ee0db095447bfe77409d33bfac127ca7128299c58deef27c52eaa1b1f0
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/feast-dev/feast git https://github.com/feast-dev/feast.git
octolytics-dimension-user_id57027613
octolytics-dimension-user_loginfeast-dev
octolytics-dimension-repository_id161133770
octolytics-dimension-repository_nwofeast-dev/feast
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id161133770
octolytics-dimension-repository_network_root_nwofeast-dev/feast
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release9fabff9b8b127e686a3ec86f91422e818056ca2c
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/feast-dev/feast/pull/6324/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Ffeast-dev%2Ffeast%2Fpull%2F6324%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Ffeast-dev%2Ffeast%2Fpull%2F6324%2Ffiles
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=feast-dev%2Ffeast
Reloadhttps://github.com/feast-dev/feast/pull/6324/files
Reloadhttps://github.com/feast-dev/feast/pull/6324/files
Reloadhttps://github.com/feast-dev/feast/pull/6324/files
Please reload this pagehttps://github.com/feast-dev/feast/pull/6324/files
feast-dev https://github.com/feast-dev
feasthttps://github.com/feast-dev/feast
Notifications https://github.com/login?return_to=%2Ffeast-dev%2Ffeast
Fork 1.4k https://github.com/login?return_to=%2Ffeast-dev%2Ffeast
Star 7.1k https://github.com/login?return_to=%2Ffeast-dev%2Ffeast
Code https://github.com/feast-dev/feast
Issues 212 https://github.com/feast-dev/feast/issues
Pull requests 171 https://github.com/feast-dev/feast/pulls
Discussions https://github.com/feast-dev/feast/discussions
Actions https://github.com/feast-dev/feast/actions
Security and quality 1 https://github.com/feast-dev/feast/security
Insights https://github.com/feast-dev/feast/pulse
Code https://github.com/feast-dev/feast
Issues https://github.com/feast-dev/feast/issues
Pull requests https://github.com/feast-dev/feast/pulls
Discussions https://github.com/feast-dev/feast/discussions
Actions https://github.com/feast-dev/feast/actions
Security and quality https://github.com/feast-dev/feast/security
Insights https://github.com/feast-dev/feast/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Ffeast-dev%2Ffeast%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Ffeast-dev%2Ffeast%2Fissues%2Fnew%2Fchoose
ntkatholehttps://github.com/ntkathole
feast-dev:masterhttps://github.com/feast-dev/feast/tree/master
alan-gauthier-jt:fix-empty-string-arrayhttps://github.com/alan-gauthier-jt/feast/tree/fix-empty-string-array
Conversation 7 https://github.com/feast-dev/feast/pull/6324
Commits 3 https://github.com/feast-dev/feast/pull/6324/commits
Checks 28 https://github.com/feast-dev/feast/pull/6324/checks
Files changed 3 https://github.com/feast-dev/feast/pull/6324/files
fix: Handle array of strings columns in Athena materialization https://github.com/feast-dev/feast/pull/6324/files#top
Show all changes 3 commits https://github.com/feast-dev/feast/pull/6324/files
2a27d40 fix: handle string arrays in materialization alan-gauthier-jt Apr 24, 2026 https://github.com/feast-dev/feast/pull/6324/commits/2a27d4000cdaeeb4df2ecba4112102fe08f32191
6498775 pr feedback: none default values per type alan-gauthier-jt May 7, 2026 https://github.com/feast-dev/feast/pull/6324/commits/6498775b604b4fcbee69f1d7f5efa6f5472a4977
066c9a2 fix integration tests alan-gauthier-jt May 26, 2026 https://github.com/feast-dev/feast/pull/6324/commits/066c9a229c4ee32ce5faffb943ba27cf49e1c00a
Clear filters https://github.com/feast-dev/feast/pull/6324/files
Please reload this pagehttps://github.com/feast-dev/feast/pull/6324/files
Please reload this pagehttps://github.com/feast-dev/feast/pull/6324/files
type_map.py https://github.com/feast-dev/feast/pull/6324/files#diff-c8d42aa830ab4d8fd6aa406e94e35664969bb39435ec15c7627ac1606fb185c0
test_offline_write.py https://github.com/feast-dev/feast/pull/6324/files#diff-9499dcc21d9c5f7140b90098a2983d6f8ac9bb8b8eb59c9cdb82acca20f553ba
test_type_map.py https://github.com/feast-dev/feast/pull/6324/files#diff-7993ac6fdd117f8808587f1b4d664e8dcc71bc3749bd9ac21a714bf3db441736
https://github.com/feast-dev/feast/blob/master/CODEOWNERS#L10
sdk/python/feast/type_map.pyhttps://github.com/feast-dev/feast/pull/6324/files#diff-c8d42aa830ab4d8fd6aa406e94e35664969bb39435ec15c7627ac1606fb185c0
View file https://github.com/alan-gauthier-jt/feast/blob/066c9a229c4ee32ce5faffb943ba27cf49e1c00a/sdk/python/feast/type_map.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/feast-dev/feast/pull/6324/{{ revealButtonHref }}
https://github.com/feast-dev/feast/pull/6324/files#diff-c8d42aa830ab4d8fd6aa406e94e35664969bb39435ec15c7627ac1606fb185c0
https://github.com/feast-dev/feast/pull/6324/files#diff-c8d42aa830ab4d8fd6aa406e94e35664969bb39435ec15c7627ac1606fb185c0
https://github.com/feast-dev/feast/pull/6324/files#diff-c8d42aa830ab4d8fd6aa406e94e35664969bb39435ec15c7627ac1606fb185c0
https://github.com/feast-dev/feast/pull/6324/files#diff-c8d42aa830ab4d8fd6aa406e94e35664969bb39435ec15c7627ac1606fb185c0
https://github.com/feast-dev/feast/pull/6324/files#diff-c8d42aa830ab4d8fd6aa406e94e35664969bb39435ec15c7627ac1606fb185c0
https://github.com/feast-dev/feast/pull/6324/files#diff-c8d42aa830ab4d8fd6aa406e94e35664969bb39435ec15c7627ac1606fb185c0
https://github.com/feast-dev/feast/blob/master/CODEOWNERS#L10
sdk/python/tests/integration/offline_store/test_offline_write.pyhttps://github.com/feast-dev/feast/pull/6324/files#diff-9499dcc21d9c5f7140b90098a2983d6f8ac9bb8b8eb59c9cdb82acca20f553ba
View file https://github.com/alan-gauthier-jt/feast/blob/066c9a229c4ee32ce5faffb943ba27cf49e1c00a/sdk/python/tests/integration/offline_store/test_offline_write.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/feast-dev/feast/pull/6324/{{ revealButtonHref }}
https://github.com/feast-dev/feast/pull/6324/files#diff-9499dcc21d9c5f7140b90098a2983d6f8ac9bb8b8eb59c9cdb82acca20f553ba
https://github.com/feast-dev/feast/pull/6324/files#diff-9499dcc21d9c5f7140b90098a2983d6f8ac9bb8b8eb59c9cdb82acca20f553ba
https://github.com/feast-dev/feast/blob/master/CODEOWNERS#L10
sdk/python/tests/unit/test_type_map.pyhttps://github.com/feast-dev/feast/pull/6324/files#diff-7993ac6fdd117f8808587f1b4d664e8dcc71bc3749bd9ac21a714bf3db441736
View file https://github.com/alan-gauthier-jt/feast/blob/066c9a229c4ee32ce5faffb943ba27cf49e1c00a/sdk/python/tests/unit/test_type_map.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/feast-dev/feast/pull/6324/{{ revealButtonHref }}
https://github.com/feast-dev/feast/pull/6324/files#diff-7993ac6fdd117f8808587f1b4d664e8dcc71bc3749bd9ac21a714bf3db441736
https://github.com/feast-dev/feast/pull/6324/files#diff-7993ac6fdd117f8808587f1b4d664e8dcc71bc3749bd9ac21a714bf3db441736
https://github.com/feast-dev/feast/pull/6324/files#diff-7993ac6fdd117f8808587f1b4d664e8dcc71bc3749bd9ac21a714bf3db441736
Please reload this pagehttps://github.com/feast-dev/feast/pull/6324/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.