Using Databricks FILE type against data on NAS: what works today with FSx for ONTAP S3 Access Points A developer tested Databricks' FILE column type against files on Amazon FSx for ONTAP via S3 Access Points, finding that registration works but reads fail. The zero-copy approach is not viable; FILE EXTERNAL and FILE MANAGED variants behave differently, with managed copies succeeding but external references failing. Design tips include using a separate volume for FileSpace and checking ONTAP version via REST API. A follow-up to Part 2: Databricks and FSx for ONTAP S3 Access Points in the "FSx for ONTAP S3 Access Points x Lakehouse Deep Dive" series. Some results changed since Part 2 — if you read that one, see "Why reads fail" below. I tested whether images and PDFs already sitting on FSx for ONTAP can be referenced from Databricks without copying them into the lakehouse. The result is: registration works, reads do not. If you only need the zero-copy verdict, read "Connecting to an FSx for ONTAP S3 Access Point" and "Design tips" below. If you want the behaviour of the FILE type itself, start from the top. Databricks shipped FILE as a beta column type: a reference to an unstructured file held as a single column in a Delta table. The value is a struct carrying uri / offset / size / content type / checksum . Because it holds the reference and the metadata as a struct, you can pass it straight from a table into an AI function such as ai parse document . There are two variants — FILE EXTERNAL , which holds only the reference, and FILE MANAGED , which copies the bytes into Databricks. I tested this against files on Amazon FSx for NetApp ONTAP, reached through an FSx for ONTAP S3 Access Point — the feature that exposes an ONTAP volume over an S3-compatible API. Here is what I found: FILE EXTERNAL and FILE MANAGED before you ingest GROUP BY and DISTINCT are accepted; = and ORDER BY are rejectedBelow: what is established for each of those four, and how to turn it into design decisions. The templates and scripts are in the repository, so you can re-run the same tests in your own account. Repository: Yoshiki0705/fsxn-lakehouse-integrations https://github.com/Yoshiki0705/fsxn-lakehouse-integrations | Item | Value | |---|---| | Measured | 2026-08-12 | | Storage | One FSx for ONTAP file system | | Access Point | One, INTERNET origin, UNIX root identity | | Workspace | One non-trial workspace, purpose-built, same account and region | | Compute | Serverless SQL warehouse, and a classic DBR 18.2 cluster | | Control | A S3 general bucket in the same account, running the same operations alongside | | Method | SQL Statement Execution API, and boto3 from my workstation | Running the S3 general bucket control alongside matters. Looking only at the Access Point side, you cannot separate a defect in your own environment from behaviour specific to the Access Point. Except where stated otherwise, every conclusion below rests on the same operation succeeding against S3 general bucket. Note that the object tag results depend on the ONTAP tag validation implementation, so a different ONTAP version may behave differently. The FSx console and describe-file-systems do not expose the version; use the ONTAP REST API GET /api/cluster?fields=version to check yours. First, the behaviour of the type itself. There is prior work on this feature from Databricks Japan: パス文字列でもバイナリでもない。DatabricksのFILE型を試す https://qiita.com/taka yayoi/items/ab110946862e63dca9f6 by taka yayoi. Every operational caveat it lists reproduced in my environment, so I have tabulated those first. What follows is my paraphrase and my own measurements, not a translation. Some terms first. FILE MANAGED copies bytes into a Databricks-side location called a FileSpace. list files enumerates files on a Volume and returns FILE values; create file constructs a FILE value explicitly. object metadata reads an object's tags and user metadata. | Behaviour | Measured | Design implication | |---|---|---| | FileSpace on the same volume as the source | CREATE TABLE succeeds; INSERT fails with Cannot get file metadata under managed storage | Give the FileSpace its own volume | checksum on FILE values from list files | Null on every row | Not usable for integrity checks | checksum under FILE MANAGED | Populated with ETAG:"…" , matching the etag from object metadata on S3 general bucket exactly as a string | Comes from the object store, so it is usable for reconciliation | Filenames under FILE MANAGED | Replaced with an opaque UUID; the extension does not survive either | Copy the name to a column before ingesting | Format of uri | Prefixed with dbfs: | Normalise before writing string comparisons | | Serverless notebooks | Unsupported | Use the SQL Statement Execution API against a serverless SQL warehouse | | Automatic garbage collection in beta | Does not run | The FileSpace grows on every re-run. Plan for manual deletion | | The Previews page toggle | Used FILE EXTERNAL / FILE MANAGED without touching it confirmed on 2 workspaces | May not be required. Do not assume either way | content type from create file | binary/octet-stream for both Japanese and ASCII | Pass it explicitly if anything downstream branches on it | What this tells us The difference between FILE EXTERNAL and FILE MANAGED is not only whether bytes are copied. Whether checksum is populated and whether the filename survives both change. Reversing the decision later means re-ingesting, so decide before you ingest. On content type , I got binary/octet-stream for both Japanese and ASCII input. For the same files, list files reported text/plain , so the two paths infer differently. If anything downstream branches on content type , pass it explicitly. Both the documentation and the prior article state that FILE columns cannot be used in grouping expressions. Testing it, support splits more finely than that. | Operation | Result | |---|---| GROUP BY file | accepted | SELECT DISTINCT file | accepted | GROUP BY file.uri | accepted the documented approach | d.file = r.attachment | rejected — The = does not support ordering on type "FILE" | ORDER BY file | rejected — The sortorder does not support ordering on type "FILE EXTERNAL" | What this tells us GROUP BY and DISTINCT both need equality semantics to decide group membership. Both are accepted while the equality operator itself is explicitly rejected. Since the error names the type's operator surface, this does not look like row-count-dependent behaviour. That said, this was confirmed on two rows. I cannot rule out that grouping degrades to identity comparison rather than value equality. In practice, use GROUP BY file.uri and do not depend on GROUP BY file being accepted. This is beta, so the behaviour may change. This is the main question. The answer is "registration works, reads do not", and the cause is not a lack of Access Point support. | Item | Required form | Symptom when wrong | |---|---|---| | External ID in the trust policy | The Databricks account UUID | 403 Forbidden from the storage provider. The metastore ID and the workspace ID do not work | | Self-assume in the trust policy | Account root as the principal, with an aws:PrincipalArn condition naming the role ARN | Naming the role as its own principal fails at creation with Invalid principal , because IAM validates that the principal exists. Unity Catalog requires the role to be able to assume itself | | Resource in the IAM permission policy | The access point ARN arn:aws:s3: