Gabor Kaszab created IMPALA-11363:
-------------------------------------

             Summary: Use ReadValueBatch() when the members of Parquet 
StructColumnReader
                 Key: IMPALA-11363
                 URL: https://issues.apache.org/jira/browse/IMPALA-11363
             Project: IMPALA
          Issue Type: Improvement
          Components: Backend
    Affects Versions: Impala 4.1.0
            Reporter: Gabor Kaszab


IMPALA-9496 introduced the support for querying structs in the select list also 
from Parquet tables. This required adding a new column reader: 
StructColumnReader that has the usual interface as all the other Parquet column 
readers. However, the ReadValueBatch of the StructColumnReader calls the 
ReadValue() of its children instead of ReadValueBatch() so even though the 
batched read is called on the StructColumnReader it will in fact do a 
non-batched read.

The reason for this is that if the batched read would have been called on the 
children readers then currently there is no way to set the parent struct to 
null when the children reader find that the def_level_ indicates that the 
struct member is null. It's even more complicated when there is a nested struct 
column.

This has an impact on performance as querying a struct is slower than querying 
its children together. As a solution I see 2 approaches:

1) Enhance the ScalarColumnReaders that when they do a ReadValueBatch() and see 
based on def_level_ that there is a NULL value, then it also sets the parent 
structs to NULL not just itself. For this the scalar reader should keep track 
of the max def levels of the parent structs and their details in the internal 
representation (e.g. tuple offset, etc.)

2) Only the first child of the struct is used as a struct child while the 
others could be regular column readers not inside the struct. As a result the 
first child wouldn't be read in a batched manner but then the struct could be 
set based on the def_level coming from this child. All the other members could 
be then read in a batched manner.
This needs some extra care when there are nested structs. In this case all the 
struct would be added as children to the current struct, and what I described 
above would only apply for the struct(s) at the bottom of the tree.

I personally would go for 1) as it is more straighforward and easier to 
understand.



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-all-unsubscr...@impala.apache.org
For additional commands, e-mail: issues-all-h...@impala.apache.org

Reply via email to