Data, Spark: Add format model TCK coverage for vectorized reads (WIP) - #17610
Data, Spark: Add format model TCK coverage for vectorized reads (WIP)#17610joyhaldar wants to merge 1 commit into
Conversation
| return false; | ||
| } | ||
|
|
||
| protected Set<FileFormat> supportedFormats() { |
There was a problem hiding this comment.
I don't really like this one.
Could we just re-define FILE_FORMATS, and FORMAT_AND_GENERATOR in TestSparkVectorizedFormatModel?
private static final FileFormat[] FILE_FORMATS = {FileFormat.ORC, FileFormat.PARQUET};
private static final List<Arguments> FORMAT_AND_GENERATOR
This relies on the fact, how junit works internally, but no change is required in all of the tests.
I'm open for other ideas as well, this is just the first one occured to me
There was a problem hiding this comment.
Thank you for the suggestion @pvary I tried it out and here's what I found:
Redefining FILE_FORMATS in the subclass works as you described, those tests drop AVRO with no base class changes.
Redefining FORMAT_AND_GENERATOR doesn't work as is, because it references DataGenerators, which is package-private in org.apache.iceberg.data while TestSparkVectorizedFormatModel is in org.apache.iceberg.spark.data.
I tried making DataGenerators, DataGenerators.ALL and the DataGenerator interface public, and with that both fields can be redefined in the subclass. All AVRO cases are gone and I could remove supportedFormats() and the per test assumptions entirely. TestSparkFormatModel and TestFlinkFormatModel still pass.
Would you like me to go with that, or would you rather avoid widening the visibility of those test classes?
There was a problem hiding this comment.
I'm fine with making the DataGenerator and related stuff public in the test packages
There was a problem hiding this comment.
Thank you @pvary.
- Made
DataGenerator,DataGeneratorsandDataGenerators.ALLpublic in the test package. TestSparkVectorizedFormatModelredefines bothFILE_FORMATSandFORMAT_AND_GENERATOR.- Dropped
supportedFormats()and all the per testassumeSupportedFormat()calls from the base class.
There was a problem hiding this comment.
One thing I hit while doing this. When the subclass redefines FORMAT_AND_GENERATOR, it also has to repeat every filter the base applies. #17617 added supportsGenerator yesterday, my subclass didn't have it, and ORC + Variant came back and failed CI.
To fix it I'd have to either make supportsGenerator public, or copy the check into the subclass. Neither seems clean, and any new filter will have the same problem IIUC.
| return false; | ||
| } | ||
|
|
||
| protected boolean readOnly() { |
There was a problem hiding this comment.
Shall we split the base test class to read-tests, and read+write-tests?
Using this method in all test seem awkward a bit.
If we decide so, we might want to do it in a different PR
There was a problem hiding this comment.
I agree with you, would love your advice.
Two ways we could do it:
- Keep the read tests and shared helpers in
BaseFormatModelTests, move the write tests into aBaseReadWriteFormatModelTeststhat extends it. Existing tests move to the new class. - Insert a
BaseReadFormatModelTestsabove the currentBaseFormatModelTestsand put the read tests there. No existing subclass changes its extends.
And TestSparkVectorizedFormatModel would only extend the read-only class.
Would you like to do it in a follow-up PR or this PR?
There was a problem hiding this comment.
Please separate out the test to:
- ReadFormatModelTests as a base, and move the read tests there
- BaseFormatModelTests inheriting from ReadFormatModelTests
I would do this way
There was a problem hiding this comment.
This should be in a PR before this change
159b391 to
6b66972
Compare
| import org.apache.spark.sql.vectorized.ColumnarBatch; | ||
| import org.junit.jupiter.params.provider.Arguments; | ||
|
|
||
| public class TestSparkVectorizedFormatModel extends BaseFormatModelTests<ColumnarBatch> { |
Co-authored-by: Joy Haldar <joy.haldar@target.com>
6b66972 to
50d5209
Compare
Adds a TCK subclass for Spark's vectorized
ColumnarBatchread path.TestSparkVectorizedFormatModelredefinesFILE_FORMATSandFORMAT_AND_GENERATORto skip Avro, which has noColumnarBatchmodel registered. This required makingDataGenerator,DataGeneratorsandDataGenerators.ALLpublic in the test package.Three base class changes were needed:
readOnly()- vectorized models register readers only, so write tests are skipped.assertRecordsEqual()- read tests built expectations viaconvertToEngineRecords, which can't work for a batch type