I write some data in the Parquet format using Spark SQL where the resulting schema looks like the following:
root
|-- stateLevel: struct (nullable = true)
| |-- count1: integer (nullable = false)
| |-- count2: integer (nullable = false)
| |-- count3: integer (nullable = false)
| |-- count4: integer (nullable = false)
| |-- count5: integer (nullable = false)
|-- countryLevel: struct (nullable = true)
| |-- count1: integer (nullable = false)
| |-- count2: integer (nullable = false)
| |-- count3: integer (nullable = false)
| |-- count4: integer (nullable = false)
| |-- count5: integer (nullable = false)
|-- global: struct (nullable = true)
| |-- count1: integer (nullable = false)
| |-- count2: integer (nullable = false)
| |-- count3: integer (nullable = false)
| |-- count4: integer (nullable = false)
| |-- count5: integer (nullable = false)
I can also transform the same data into a more flat schema that looks like this:
root
|-- stateLevelCount1: integer (nullable = false)
|-- stateLevelCount2: integer (nullable = false)
|-- stateLevelCount3: integer (nullable = false)
|-- stateLevelCount4: integer (nullable = false)
|-- stateLevelCount5: integer (nullable = false)
|-- countryLevelCount1: integer (nullable = false)
|-- countryLevelCount2: integer (nullable = false)
|-- countryLevelCount3: integer (nullable = false)
|-- countryLevelCount4: integer (nullable = false)
|-- countryLevelCount5: integer (nullable = false)
|-- globalCount1: integer (nullable = false)
|-- globalCount2: integer (nullable = false)
|-- globalCount3: integer (nullable = false)
|-- globalCount4: integer (nullable = false)
|-- globalCount5: integer (nullable = false)
Now when I run a query on the first data set on a column like global.count1, it takes a lot longer than querying globalCount1 in the second data set. Conversely, writing the first data set into Parquet takes a lot shorter than writing the 2nd data set. I know that my data is stored in a columnar fashion due to Parquet, but I was thinking that all the nested columns would be stored together individually. In the 1st data set for instance, it seems to that the whole 'global' column is being stored together as opposed to 'global.count1', 'global.count2' etc. values being stored together. Is this expected behavior?