CSV is row-oriented, so two columns cost you all forty.
On the canvas
The CSV box is one solid block. The bytes-read bar is full even though the query names two columns.
In plain English
In a CSV line every column of a record sits next to every other one. To reach field 7 you must read and split fields 1 through 6. There is no index and no type, so Spark also parses text into longs and decimals for every value it touches.
Without this step
Expecting select('region','amount') to make a CSV read cheaper. The file layout decides what leaves storage; the projection only decides what you keep afterwards.
What if the file stored a column contiguously instead?