From bb751d8ff8821635efd739f71a1ac92214608baf Mon Sep 17 00:00:00 2001 From: Becker Ewing Date: Mon, 15 Dec 2025 16:18:10 -0500 Subject: [PATCH] Add vectorized read support for parquet BYTE_STREAM_SPLIT encoding - Split out from https://github.com/apache/iceberg/pull/14800 --- LICENSE | 1 + ...VectorizedByteStreamSplitValuesReader.java | 175 ++++++++++++++++++ .../parquet/VectorizedPageIterator.java | 3 + .../BYTE_STREAM_SPLIT/double.parquet | Bin 0 -> 8459 bytes .../double_with_nulls.parquet | Bin 0 -> 6986 bytes .../encodings/BYTE_STREAM_SPLIT/float.parquet | Bin 0 -> 4427 bytes .../float_with_nulls.parquet | Bin 0 -> 3754 bytes .../resources/encodings/PLAIN/double.parquet | Bin 0 -> 8459 bytes .../encodings/PLAIN/double_with_nulls.parquet | Bin 0 -> 6986 bytes .../encodings/PLAIN/float_with_nulls.parquet | Bin 0 -> 3754 bytes .../parquet/TestParquetVectorizedReads.java | 18 +- .../parquet/TestParquetVectorizedReads.java | 18 +- 12 files changed, 205 insertions(+), 10 deletions(-) create mode 100644 arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedByteStreamSplitValuesReader.java create mode 100644 parquet/src/testFixtures/resources/encodings/BYTE_STREAM_SPLIT/double.parquet create mode 100644 parquet/src/testFixtures/resources/encodings/BYTE_STREAM_SPLIT/double_with_nulls.parquet create mode 100644 parquet/src/testFixtures/resources/encodings/BYTE_STREAM_SPLIT/float.parquet create mode 100644 parquet/src/testFixtures/resources/encodings/BYTE_STREAM_SPLIT/float_with_nulls.parquet create mode 100644 parquet/src/testFixtures/resources/encodings/PLAIN/double.parquet create mode 100644 parquet/src/testFixtures/resources/encodings/PLAIN/double_with_nulls.parquet create mode 100644 parquet/src/testFixtures/resources/encodings/PLAIN/float_with_nulls.parquet diff --git a/LICENSE b/LICENSE index 80cfd3652e69..13ee00992e69 100644 --- a/LICENSE +++ b/LICENSE @@ -229,6 +229,7 @@ This product includes code from Apache Parquet. * DynConstructors.java * IOUtil.java readFully and tests * ByteBufferInputStream implementations and tests +* ByteStreamSplitValuesReader implementation Copyright: 2014-2017 The Apache Software Foundation. Home page: https://parquet.apache.org/ diff --git a/arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedByteStreamSplitValuesReader.java b/arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedByteStreamSplitValuesReader.java new file mode 100644 index 000000000000..42c288b16886 --- /dev/null +++ b/arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedByteStreamSplitValuesReader.java @@ -0,0 +1,175 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.iceberg.arrow.vectorized.parquet; + +import java.io.EOFException; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import org.apache.arrow.vector.FieldVector; +import org.apache.parquet.bytes.ByteBufferInputStream; +import org.apache.parquet.column.values.ValuesReader; +import org.apache.parquet.io.api.Binary; + +/** + * A {@link VectorizedValuesReader} implementation for the encoding type BYTE_STREAM_SPLIT. This is + * adapted from Parquet's ByteStreamSplitValuesReader. + * + * @see + * Parquet format encodings: BYTE_STREAM_SPLIT + */ +public class VectorizedByteStreamSplitValuesReader extends ValuesReader + implements VectorizedValuesReader { + + private int totalBytesInStream; + private ByteBufferInputStream in; + private ByteBuffer decodedDataStream; + + public VectorizedByteStreamSplitValuesReader() {} + + @Override + public void initFromPage(int ignoredValueCount, ByteBufferInputStream inputStream) + throws IOException { + totalBytesInStream = inputStream.available(); + this.in = inputStream; + } + + @Override + public float readFloat() { + ensureDecodedBufferIsInitializedForElementSize(FLOAT_SIZE); + return decodedDataStream.getFloat(); + } + + @Override + public double readDouble() { + ensureDecodedBufferIsInitializedForElementSize(DOUBLE_SIZE); + return decodedDataStream.getDouble(); + } + + @Override + public void readFloats(int total, FieldVector vec, int rowId) { + readValues( + FLOAT_SIZE, + total, + rowId, + offset -> vec.getDataBuffer().setFloat(offset, decodedDataStream.getFloat())); + } + + @Override + public void readDoubles(int total, FieldVector vec, int rowId) { + readValues( + DOUBLE_SIZE, + total, + rowId, + offset -> vec.getDataBuffer().setDouble(offset, decodedDataStream.getDouble())); + } + + private void ensureDecodedBufferIsInitializedForElementSize(int elementSizeInBytes) { + if (decodedDataStream == null) { + decodedDataStream = + decodeDataFromStream(totalBytesInStream / elementSizeInBytes, elementSizeInBytes); + } + } + + private void readValues(int elementSizeInBytes, int total, int rowId, OutputWriter outputWriter) { + ensureDecodedBufferIsInitializedForElementSize(elementSizeInBytes); + decodedDataStream.position(rowId * elementSizeInBytes); + for (int i = 0; i < total; i++) { + int offset = (rowId + i) * elementSizeInBytes; + outputWriter.writeToOutput(offset); + } + } + + @FunctionalInterface + interface OutputWriter { + void writeToOutput(int offset); + } + + private ByteBuffer decodeDataFromStream(int valuesCount, int elementSizeInBytes) { + ByteBuffer encoded; + try { + encoded = in.slice(totalBytesInStream).slice(); + } catch (EOFException e) { + throw new RuntimeException("Failed to read bytes from stream", e); + } + byte[] decoded = new byte[encoded.limit()]; + int destByteIndex = 0; + for (int srcValueIndex = 0; srcValueIndex < valuesCount; ++srcValueIndex) { + for (int stream = 0; stream < elementSizeInBytes; ++stream, ++destByteIndex) { + decoded[destByteIndex] = encoded.get(srcValueIndex + stream * valuesCount); + } + } + return ByteBuffer.wrap(decoded).order(ByteOrder.LITTLE_ENDIAN); + } + + /** BYTE_STREAM_SPLIT only supports FLOAT and DOUBLE */ + @Override + public boolean readBoolean() { + throw new UnsupportedOperationException("readBoolean is not supported"); + } + + /** BYTE_STREAM_SPLIT only supports FLOAT and DOUBLE */ + @Override + public byte readByte() { + throw new UnsupportedOperationException("readByte is not supported"); + } + + /** BYTE_STREAM_SPLIT only supports FLOAT and DOUBLE */ + @Override + public short readShort() { + throw new UnsupportedOperationException("readShort is not supported"); + } + + /** BYTE_STREAM_SPLIT only supports FLOAT and DOUBLE */ + @Override + public int readInteger() { + throw new UnsupportedOperationException("readInteger is not supported"); + } + + /** BYTE_STREAM_SPLIT only supports FLOAT and DOUBLE */ + @Override + public long readLong() { + throw new UnsupportedOperationException("readLong is not supported"); + } + + /** BYTE_STREAM_SPLIT only supports FLOAT and DOUBLE */ + @Override + public Binary readBinary(int len) { + throw new UnsupportedOperationException("readBinary is not supported"); + } + + /** BYTE_STREAM_SPLIT only supports FLOAT and DOUBLE */ + @Override + public void readIntegers(int total, FieldVector vec, int rowId) { + throw new UnsupportedOperationException("readIntegers is not supported"); + } + + /** BYTE_STREAM_SPLIT only supports FLOAT and DOUBLE */ + @Override + public void readLongs(int total, FieldVector vec, int rowId) { + throw new UnsupportedOperationException("readLongs is not supported"); + } + + /** The Iceberg reader currently does not do skipping */ + @Override + public void skip() { + throw new UnsupportedOperationException("skip is not supported"); + } +} diff --git a/arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedPageIterator.java b/arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedPageIterator.java index be1a3324ae43..c5613c1b67b2 100644 --- a/arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedPageIterator.java +++ b/arrow/src/main/java/org/apache/iceberg/arrow/vectorized/parquet/VectorizedPageIterator.java @@ -100,6 +100,9 @@ protected void initDataReader(Encoding dataEncoding, ByteBufferInputStream in, i case DELTA_BINARY_PACKED: valuesReader = new VectorizedDeltaEncodedValuesReader(); break; + case BYTE_STREAM_SPLIT: + valuesReader = new VectorizedByteStreamSplitValuesReader(); + break; default: throw new UnsupportedOperationException( "Cannot support vectorized reads for column " diff --git a/parquet/src/testFixtures/resources/encodings/BYTE_STREAM_SPLIT/double.parquet b/parquet/src/testFixtures/resources/encodings/BYTE_STREAM_SPLIT/double.parquet new file mode 100644 index 0000000000000000000000000000000000000000..3e0edd2627abf81564851f5f3c4bf5dadb1b07d0 GIT binary patch literal 8459 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 Pam@krbac4m-yr@AObT5v literal 0 HcmV?d00001 diff --git a/parquet/src/testFixtures/resources/encodings/BYTE_STREAM_SPLIT/double_with_nulls.parquet b/parquet/src/testFixtures/resources/encodings/BYTE_STREAM_SPLIT/double_with_nulls.parquet new file mode 100644 index 0000000000000000000000000000000000000000..d23c1e6b7387132eb6af9acb510b62131897f9e6 GIT binary patch literal 6986 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 W@{00`yaEDe|LjjmL4iKoqWv#d8v2R= literal 0 HcmV?d00001 diff --git a/parquet/src/testFixtures/resources/encodings/BYTE_STREAM_SPLIT/float.parquet b/parquet/src/testFixtures/resources/encodings/BYTE_STREAM_SPLIT/float.parquet new file mode 100644 index 0000000000000000000000000000000000000000..8ba32a302f0890b788364c990345b39a2fc75139 GIT binary patch literal 4427 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 VQd&|Pg+>E=cBF#A^nuSP{{tAvM#}&I literal 0 HcmV?d00001 diff --git a/parquet/src/testFixtures/resources/encodings/BYTE_STREAM_SPLIT/float_with_nulls.parquet b/parquet/src/testFixtures/resources/encodings/BYTE_STREAM_SPLIT/float_with_nulls.parquet new file mode 100644 index 0000000000000000000000000000000000000000..c16e10e6804e8d5b3155e5814218afdcde9c1d17 GIT binary patch literal 3754 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 literal 0 HcmV?d00001 diff --git a/parquet/src/testFixtures/resources/encodings/PLAIN/double.parquet b/parquet/src/testFixtures/resources/encodings/PLAIN/double.parquet new file mode 100644 index 0000000000000000000000000000000000000000..edd614c66af653260bade9a3b7d1300c820ccfc1 GIT binary patch literal 8459 zcmb7qc|2877q$$AN{GyvNhz7v5b`@loW-KWGG{UCKQ#ViHcN|B+;NU zCu0Kj6;e1uIU!RvB zLFbpK)$KD!)PdRoUAhr?=O(s=1k+KMQW4hokqS}gDV}exY<$#sSZ1?P89E($n+v3E zp-|uzxvPBvo+XUDQtmcHubH)BnvElJdleUDnF+wkddF5$zdqJ4xms#Prh;bfO#;~& z!n+ho?H3whRCczhAj%at!i>8-ESRY1J#eM*=>Xa6wxTsjorzGX${eW(8f5eL3>ffH zu#nepC{0=i`A;7VYK?KgIJj|M@GGD%C61Pxrh=B8KL`3as!(3JwBfrB3$^CwBd_YX zq2xjQ_rldo7^muFIFRUQs(Nf#_1pRc!6u%fN@ z!q^@&%zS??SXOERY0u@d31Tj|xxGD5$Ic9~v0J^bnYkkMr5>MHI2*OP)<+pL*09PWYI-bAou{@yzOSGmNWdKG&R2 z#qj`k$u4&dge;zI_H+HnOva#E8>J;rE3kNs?Pjuc|;+EBx>xU=ZF-xhB^AY4n79%ALm!*s54L-7<;VfvKCCH zKRTa$Xb&C(hmbvcov|T3UvbBNGi*nn5P)bKB_goeBnsdGx1$d=(jc*HvGi>f<8uZkeG8;YYss_Ii{L+oIY>JaMMa z5$XAQdLjBNz}Mfr6T6IX_PlaK>@YyFGvf6KafJ%+`q6P-W8CGP|?^U0gjq!o0rW;vJ zMQEBOCu)l!UPMTCdq%Cq;t}N(r;QvqeU;($IP8M5r#73{p0!7(&#$P=lMK8sZjkt` z!^G7$t3zUi^+Deooz>~53WvU%2@!{FvG-wCXv=C_B&(K$eq3h{EB2~hNy4tLJPe6W zc}>O12^)tC$GB+vlu-4zoam?aEab4V4Jsyi9*h3~Ttf03t`q(#cbUJ&v2GJMC>Y4D z6VOMQ)9GG>+MzOg@V+GBuRjJgM&9o*N54nt!G*s~@Y3zX`XLDpMqazT6klNn{zqxv zXH!@RKHv3QE72L8h~w8u77_^F73LrGn~R{9&G|=%2tRtFY3ET>E{rY;;DD^B z)OlkTHYR1qW}aD#AZ^|^1`ZC$f8XLV=52`lk#n!8i)}FKVgAZGLJIBS4;4Bmt>DAn z#rx|F7som!9_k$+{D7>1-Qr^mNCXIOmaDTv-yzwtSPfh32^2JaP5Arm6)#e*_j9r5 zuV2yYC(dwV+b(aNrlE{`Z!&*+4KjpxN&(TBu-7P{p>RfRoVmo=mdtyCGEFzm6Fvc?D)R(%yG?7$ef47~& z#@9ker{fAq-CqHPs!nJV zg=F~UHaCtvrK7`Qr%4FE0$z3~^N4)3gS3DAeYx*kX#L69%uo2e;Hvj;2VE6V^Xi36 z9n}!QU7BIa#QWzpG+x=ow*9N#JXb7?vdKKkO$ zk2g%j^Xavo&!xeA<;f zC;inDi9O=t6**J{?pyvzBbtM$>=UuqJ6FO*i*#{PQWJZ3X8f=WQb*LS8B^<0XWT73 zKvJ+U$MC!?pBI*H=y$Dbx%HKX;@Lc|)CL1cm1a+nZn{Ity>0N1zZtBa(zFe?I$$O# z*G-eK=ac6~=%Sh|oZ8$OT^^}|UsIt{4TQb*EM1()chMYmK5v^SSKGSZ3I{d_f1LJd?v17-)xJ`bxDC)oWCuCxb+*^X;8R_L{ zYi&$;zmyFciE~7)fDOgsXsdL4XKeFc5EInRguU<-S5e6oX=iJ@0}59o;QGQ*!@XLF z?-%(T{E~z%yFzSZqS<(Q|4HMTVFq@6B+JJU`w@%Wqqv;V&p$c;*z`O@ywzdLeE((w zu|sdt1vAv3HsZabb{_*P8)BTJWZ5WEWrv=j*mh`?K+4HxVWp7cSb*dyIvW6piwyME{=9*+ElcUu+Pd`RiR_V4Y3o-`GNR zH2*3T>3PNi_3+y@b5SfTJ{x<&m1Km;2ZgbkAxtcbxN`12pFIL@QF{6lNthOSCu-Es zz>J6ElkE?T5c!VhWAqp=m{Kvmid20(e>nS~E*S7SXx!C#oCTNCGC3)2E{4iB9xfO) zheMKad5jPhg=S>s{@>PU`SPH6eKHq++G#g4h`29TB1(CA3Lj7Ae+aNRLcy9G_8&ob29dF3AMAM_E=TsuKAoXGR&`kkbe4}QxGvYaz-hZ>| z^%xb;OjaGA%3>oStHmzwksBU`EtR23lkjSK`a-_HGyaD>&gUrIovpAyt5NXYtXNwd zy^yNhGUtM#<}+6nyr@X)v~qn%w#P@FpJv5!cDQ?g`5o*c1fQAY4e;e4qc)rXPzsd`!}AN=y0rDtMH&?@wzq4vH# zPBv*+(n&0oF&daBlofEfO~~zSl?|SW%jnPTamUQ{-Sw&4_0hEE<+HLN8lG>DlUq>b zfbC}7Ej$4x5SN)B-Vi`Vkf&%dwe~&P%%fFL`w<;>-UFAM!NBZ?NIqMdI+*HSi+U-x zXw+CdU74$kJGWgje@}97)_!=ZbI=iXPkUZ(SSEqc;hk@zKbgRC*?wCOLl&-bB;{|u zu*3Mxm(!v`OgtYBS|3+I#gOW~zwwn^kS?3AXlihUf&QNX)NvrR`O4qU zxZ(au$4HOgH1IuHDWzrUh<7oP$wd#DFp7H8@?euQQW>Z2D~GbNLN9Bne;yr2e3F!qOM&&QRIz0{9XeD;MKLxD<~bHNQ?EHt)Aanh>zfTk zZY;bcQ$Yt$6WJry%^68?8zj$axgm!oyRm7p5ehbqp31GXqk{DABCS<*6%6ZDqG}}V zv6_cBPF+C)B@dsbCQn)6iqMtzeJc%N%CmuWngiJ0?5*orz`%&%-o{p<{n&Tu!LDXH zcH`|n_xs)jzDlSSZkgW1H%GQ&FJ)&Ec;kPZga7@Z#j$Y|2oElk z{0u6jUhOp-NM@khpzfuaGZhmrc9lzY(oy(wuq&a41DllDm1oEG;i0S2@zRwCf)(H2 z|BPOPEluqi2_!8{$N%;^c$W(M;7du*^<2;{M-3TxYKR+uF9jXlL&F^f&9~~>3^;X) zj|Dtli+ev0L{eq2t|o0HWehZp9w-9EV*uDVUIbP%U?)|ZV<8P&=CD*1wL}<_6O7RF~pmwBxA?I@CxY)867>G z2-{X-V`PXU<>@I(lMEKnGYW~dKJalL~?E3JOi1#>FeLpZoM^En_&JZzQjOYUQ$Ldr# zNjzJZkm`WVPZt|CykH(pSV2`ZfA=O_x!>?#dPEj>U~y91qA0(5856f{FW|jFjC4K z53AlQkE@!3Y$Dj2t-Jz#brV}wSm}cqc4Sz8R1@KWSA~~6bwZqSV+5ZF1D<08^V$>i zFqUHO6MoJRqyV$A8bb#JTzn(SRiGn#B_-bGqNpb4>a@`3#O2lq@g_>im@M7zp z^<1ple6;j$nKKUCF1@g88^H^CPG-eZw9szu@lxX^i`ZW_xseY!VCwlnzMwV&-%TW) z6}avK_C(Ey{VscGDEqG9nQw=Sd17@pw&_8w`c&)BGzoP3wB@%XaUhjy#53M+50>4O zZR%krHa$I}E+RzWz@B$Sd}kHFraN67-sKJvx!hY>+a;mxZlC?JeKooY%A2@qE?Ao_ z8obtzg!sdcb}W6zMMv2;YE^|M!oDt23zKIc{n^jU-BdS7+)aN}Q_q09Nu^0%mJ!|@ z>ns1FIY_*`fX6ah+Exc9?9tDJr&~1rO0YWBocVC@1A+?i?h6<>kZBSnQ5; z?Ybj&F>VmrxQ%vXAHl1web9Kcf`ifGwl=TF29WM?t0Ku7Libx;WKBF3(yDWJ=)nXY z@(I{=+E*7#3tz?+&0mhM{;dJSif!bOzapvO#P}LrI!TQcuE-1z>a$QH@XvTbNt3!U zsRP8E7pXUs?-y zyjN6pIg(6;H|1}@ZVm_DMaG_wiMV3&>Uo|3GiNN&mAcclmWt&4uiRhXU}N^l#NMzn zCO&)qp6`_@4{C5w-l@E`5LXL()b)UbkWJs1%xXHKM($sD7wLliPP6MmyDV_8?3T?) z53zo283L)sG}O-XyXYKCgFth2ol+JD;WNEv3+FpRFyyXwc7+3MwtWjbwM+?*O(!Jw zepmu&%A2Gg1-6i#u=Tv903_7EklZX}iaLer`f+O&xP`6PFkeK>YjA6x3c)L+`F{#a zd*FhL`K=a$4IF%FITvm{%Z0dVoBFX9Dw1ZeMaFzHL)KGG?P@7eEYV!lv3!KEL(X66 z;3RuwH{Mq-b);fvQqTGBAvW%qM%gK9=wWY2wStL_D{eRCW|3;#F@JB1oK&s@_{HjW zo*=8hXZ_-)A%6-Yuil^FmH{H=-)cJQs2ID@H?(&<3$MA<2f{h+BB;9 zys$vw1|Mn5GaPsX_~gA{Gof~Ccb3I|XE+U}9c-wvgX(3?qH{aQh>8B0I;;gE-W0yD zhQft+=lPdmhBjE!KRoy9wj=I-+IQglH7=rJe>|GMor-v^a}|0-oHJY9elDxj28ZUw zOvpdb!z-hrV~>_uVdK;CD2q`#ep)~DG`A&iuhYTUuXDuwWwULi)*FEDRNE+Tlry}x zXe^e~<)Fc1-iv;MFZ)%`_pX`X)2}?Nn&xv{flPjrT2&?&!$Y-~)3>`p%FX*7-=Y7LW*rjL*3QL*>r=#$1oCRSZB4YN4Fg;bUOCxdzi#0;NmK6!F6 zUS-GXS{-KtjUVT$3kbZHJJjRp+`9%3!c?B^j9Sg)N$5SjawQ^mI9oHTv$qKA2QS z#`bUOXPSNx{LT83&#V5>A<_Dk1%el5e6Oumsak~POKM&_c*$XjaPsCZf}b@RwzZfP z;9%|S>oZB?TvWJ@@VQ;2Lz$yc^}5m)m7cu!94k~&Zd%embA|AaftjuQTUp@KY3h^I zvBUWz?)#4uxFTT1t>2?LYz+K0E{XORhwOxTeC9ha z?)1kEJO`^3Ns=bWPNFZ7BkUt(UQ71rQ`)#&Y#~%7Vh_#Jq=7bnQ+)iuQt(VM#RcR ze*fs>3OO<#Cxplo1nU2b}h-cidTJjEgLi{fT@RF#HSd?c_b)_gd#gPk@-hPqMR3{V&$S$F^ zvr&1Lk29aZ(*sjm)VEcdqHNu_CwzrWB(^S`DUl+0NcpsTNm@*}(4^n|Dy5^O;gMSU zIG{?uv9Ur>6YiFOyb{H^Xw2&1KG4v{hrJOK1zKFlEIH{hw2uYGnDk z$HlIE{`*O5xH$FB(|-f8UPSg}mVa`zLeGWuY)>K%V%iVXOW1xVPt-K1D!p<-`Q62x zR>XdE)Q}?}`+|xKx3jc<6Z`4HBIS55BJcL0y>S1o3?`nfcC_f(&w<`l&jR{Ib#zn@ z7{Bo~hFieYxGB`6ImM&NdPz zn|`j#KjQ$;s-Ev=VX8PJR9+Ifh7AVmR@Mo;OHzUb=DR}>6znMjY(G6oM2z+y2=hcALR26Kjc7G<3av= zKNckUWwZ@>r04J0805dzSCW@UQdpf=ntzjTgfGvs)+I9XGV&Tc@{+hpPI{;QY# z*RbqJEOBTETKs>d?PcVNWIqoviiOsE84V(TPbBgGJ*jnxh9FV$$jD1CqR{E?9JBv^ zAL&c;bpDBcAcYXxzY`(O6v|GDRUpNVLJ6c;|EGy!WksR5{%f?RP#pi2#P$D5;>z}) ziuLbA)QB?hUw?;x&mn~N@81b2 literal 0 HcmV?d00001 diff --git a/parquet/src/testFixtures/resources/encodings/PLAIN/double_with_nulls.parquet b/parquet/src/testFixtures/resources/encodings/PLAIN/double_with_nulls.parquet new file mode 100644 index 0000000000000000000000000000000000000000..3d4f64baa72247561f0a1b982acc0d5f97b1ce64 GIT binary patch literal 6986 zcmbt(d0dUp`*+%fHqtKbrAYhUd7rk^-Z`hUiB?*Xq*B_XWN#sDh^SNu*$O2olIl|- zM2oaqq7+%ubNhUs?|;uf&+m7=?lafSH8c0zXXcvgdS5eCGF?}KOCl|hc(f%tM2I}U z1ize=U`R}OK=3aPqy%?gYt6gUTufS?$)oZA5Q~X%ad9R6{q@CtuKoT$PZIt&ool~4 zUsWH}=jKK5c@dTR-R6kiTQ{UjHv;$k>}tL4@tDuiO>%PEVDFfKFKk{|7g z8{x)pJS`Zw(!cj|^OGS`m}J#)$w(Sx^5TaKc*t19?LTr@N(XsQ8iq9|*cjNKM9Vp> zg!Y|3h6dQmP+YaN>6;D{b>`=zuIjkK_@GXPgB2Yu)sGCT|8at3w_@KH4-V3oB}Q0& zvPRhW@`AN@84#>-NL%vB4LxpekAFPKL{RyTJ+gf+IHx6A6Uq?B@y>E(y%r%~5nL`f)?EJLE~J5w@wsg%e^%M}|4&xD0zO&b;52EAYb_$|6UM z=I7nvGf~;tw7qE52&&r2wu+Stp?f<;D*q4(*V~>J zta@mM*t!z?(?{8O$yiZcKgL8^P}xlVP7*TwGj6o|Qz7c$-z3w^fZNRQ@J7xKWgXL$K z4WDBj5x-#gWyTsM@T?F{x%E;UXJ(Vuy8F1}i2s>qZfzb=ChvMwB5Q|KKFezsA<`%e z|7N>-lmio+uEFw1Csbs6c8u6_@M5wvdM=d-z2aYI3VG?c`0Ro0ln@PvgC>1VUO7QL z^+aY(r5R2HvPxsz)eyR5uIbNRJ5Y4(UX)+9N94r?yjxzfaa*V~u7PESTgo=ab_+P7 zEBocQ_+DLnUU_3jX9o*=*?f<6URvUo^_J^Lrra?{uFL6+aKpC6>)v>0twCb`4TB}K zPS`!=ciM2L2R`T2j;Ey(3rZ{~zN85*1BcM~1ZQkW&r{fuY=&+20nSJNVPf$w{-9MFb~wEyX3N|+Ckzcy zL^DW)o^KmJu~XgvaSwkFe%2x(^=^fs39-*U`Sp8Nj@qHdS3Grgz!B+rdU~Py8aR7i zu_F(fEzUUttGJ=nysoIsZEZk=| zpQ}hFcZ>=APQ%`eSVXRsqrT(`1VhW{Gq;P%aV z$3_@1>M^Uhr@_Wv886B6#!PHX%TCNJT8m(9?iU6Q4#*oj_l&y47UQ1g&uk(k(H-$X z{`HhKd|5HvKZ`g>lrgYhQs9AQfr6W5>+LacNM<5Y%?|NFf~L<2`xXDkzxerMXSlKK zR&>nJP{Fx3l{d2nnZ?yX)fX%=wOaaT@{9{i_WM~#%Q?elaF@oSYjgy5B{OPzm*YEc zl2W{iBZ@|X?Sg4c#0hLcdb|$oZEmXn=H;Nm_I31%<9cYkyJg{ydRH8c+)mo?me7Y~ zi%BMXjgeMMx!X-p9KsN882tjW2z;bo00g0yXz60>fY+OU890v%UK=>7~WRCYqg z$;>+|yxB-q=wH5Ys{w+))2ui28KX8xOjM-B1{r}v)}1X>c&)hg=Ht92{Bv5HC!WyJ zW3kgDlvf^4dlb2Z-`hhfV9$NoZybbFzkNCEDv#P{UDEYbLxj9h4_Dl425v*+Rc{z< zL~Kp*V*FyF`zOU~D%Kju{iZ4B4(mYZSl6BJFBouNHF7QXxEsVOn@XK3IS^Lg*BY^o zijK9aaaRP#NrwtmbEUpmBDGIk{K|1Ef_AU?pcc!#tWKVQ0p7%V1SR-4uWIT#n=h14x!n{hopPw@b3UKSU;g@8*X*LsdHm= zQFSIxZ+;zH8Ks1u(_xZLg#Pv|U6RUk!5qEkHSTIsJYadrM}Em`cT9=!aSQ92VSJ}w z^}s$lcI;S?w8`HN#e?^LhfYqA`b$wVE42ch9nC3km$INx5^J4KamF?ufwZ!@ioalHfgxV% zu%y3zHG$Zn7wLi-Do`2o*-^LK1I5a$up*i*1Xg`MyHn5|;qO#Z701`0eWRDKC5eqU zWBuQ51##d}+~)tqmVx2tj_#rhS>QhV*^u;%2g#iq**{JIuf0R=nb@)M>!a}!H(>^v z7cEZaE?}ZBY;M?;u+vR^v;e)!9$06a`6sbZ6|FxDh5Oo=SaLS;q^p$?rWy(p)k7Ir z9(noPTOJAmZ;|^3Q>`%T>G*higAt-$alMb7;08l7&QF1=kAEJ_HPnXyF69-nlG+@M zRBSwwKW+|(G~>#+g;W%pkrW4i+2D6K?Pdny_j8s-E3SxRqh`^k;3P41^v{NG$h77_ zzkQYo>+Xw!@pK$P#6561X0fYQ?&{Aw}@VGUKC; zP%`uh*llft@P+B2!!f4Feku2lX*CVu-u?4GOPWYq4TslNDzhGWG!6FPx5AZX&_v+BeJ1X=uy`S8 zg$iNTx67ZbkUF$*aO-AUWbQwaQ?tSrEf1fZQ;O1rkOQmU2R(LiuQ@{WB}EZ&je`<0eO# zbr$9om$+loW{H8|24MMcT#dscI>wkLTZcNSpm7}+Yl}95_kQ-LnsI&j=e0`B#+jgF zVOLY#eF{#ss9Dmjn5gh*Vw_ZzN1M2`{(QVUX0PvRJh)vSEo+{(RRq)U&-Nr)focbc zOY=uG1yT|0C0atQdrLC&?9kJGNQb@8&_!o>fT8NWxSwo?X0;_VRXMu2bK52J*AyFP zDWlV`haC|%y7Oi12NPH>PqyzE-})*uWL4XSTiJ zY@{JRjq8ELW+wcPxTv=)6YE zeF7dBGfZgiAmjz#q=w(L(!qD@^9?mKQ{4D=-zVR1CF+FQXEyQ7ldM@wS(yax3%EbB zBr%B$q2c8cA3=rWvjnrDeIDpFsDEnaOxT&H!*5b**|6O|x9aR?eR%3B^*nXug5Z^J zZ-2zD!OWgt-UsedK?%8-_K%(mx@D=MLr)BGN zJ(cWNKexe`@;XVW0UFGE3dDp0S3owS@$Iz@?%-Y+*23{qfs$=j<$${f5WI2w0GWx> zp3x~@BMtnn8#-Q)$H7dGZ+&m32O>8yTnsmmQOT$*aocB&TVkzL7Z*p+tQgb=5i$f8 zi{5asWTN_Tw?wY2D&*>m)(P=(uyXHF`-DgCC~WyGeESvyRh_TwEgst8PQY7JCk`Ez zUJjaq${YlI(EB6HP3ZU57e7yqIl;Mgw6Iaz0q?ZSlRO{Uq3vhvx-5G-f&(_a_~yh! zM%AHfml_%1Q~B{(nW+dAYwQmfVj;9aq7&Ucy zAX9ez0OO<*0wvP5`ZSCnbg{L&zt9Q~!_wK~OI@)y-Ej6!IRyedBfnY?IU&P6ukd#X z9XZ2#A6Fg(1m_PPuscfZV_oKOl%zRGCW0N=iW(TGpWLEhtq(@{(NXGrnnAmUb8*$DMR)J;{wT2D|yzoMlBTq+s?`=s>b0@f-CA&7dSiq&LqwTYd z3Z&+)%>;+&qk#NK`ue0UULGoVu66Dk$#=ign@`uBu%lG$rgxY*v^F0r|5M?NBX zVzv=+r`J^09odhnPOgqbW-36@4+A&HD1!{_Z8eIJLP^mfH z@#F9^^!j$@wWqNmdC-XK^B@IG`)Rv_M;I9IdsWPHRvs+6)78-!cL>Yo+{)T60d03m z_WSPDSeq>xvew@UdyYKZvGf%OJr!T6)mPLJ{$;UBxEz72@1{SjZS;VuNtH=%mJwbQ z3{-wv>4Z%uwzeKmv&U5DO;NFACOk!RjrHp}AfJ+*y>q|{OmANgwI%LYxN#fp=x!qJ zUfa-o>C7qq#j|?Ey=T>bcV+bkb`8)Iw0&n^T#+>of#nQs3NyYpt@Fk!la8#j_ zr1nN9t@(;8G9!WqELIXY^K*V_i>fiIwfBUjUZlb7-PKq5*X*HJ`*Vkl4h@fszxD`7 zvvF{q6E0mv#6b$mE=TuK;Y0otxQoq(PqDGrBf?)zT|LhgXy%N4$!h#tFN_A1H+$xd_Y!roZmUd1iju|5sdE%3kK zoJa#-Yfb&iECNr@_M0u@cZ6W*UG3~E4tQibxh&zG2&Bj_(!S^0L1xm<>y|u_(%2=j zd7&xX!q=;rFDB+aq$5{}h=&dbd;DQTz9TtL3Y=|p&sur|Ukv4ZND(Er^?xYtX|pqvC>x%dPRl=7E>F9fA9u4kUh=C+0bu zWhc4b06eEV$GM}O(d4U>GY9-F8EIz}9uQO;pEK ztLz?w4-OzDl)tlnPeVajS!c#}M^t9%23=yC?n zf}dYXMpoNki`e`6xDZE-8GKT@Lc~$BuWsFL%4cF{M%mAa)8-gy^^(Z5nf9g$f+p|*na$eO5n96P7V0%YvZ`0@2k%7AF~|X4IPUQh;xAXlzsQJ zPfiFLeX5v4CZi;e_s_vRXILIsUo@)aj8_}B@zpN}j_tD6+uf@N-$hAV<_J6Tx_(m% zcdiR+3xmbtH+n#=Z0vqqlo$^96?~8@q$8=$Y(rEL4L;GUU$?v3z~sH@qZ7GQB%B(5 z+?>jQ)@9Rhi@hAgjh=2jb!rKoW(pR2$U8zncd5Di9#>p&qW)P{$HdqHpN$`Q>@jvd ze6O~P6MWL8-d}oY4*`#3-_MEAq4xcJO+JBlb4L2Socq_HAzZ0#S1bh;ypd+3W*i*< z-D~7dqv04<`b=9<3BPJjc5!ARH2%(_-)>A~pEi23g3AU2_n#j~s~}rayZuVDcuRBi@uC1ba>z&lPfQ>=hvblF?M2ojsnCN>gD@1 zF~N19TER-f1lehH5m`e2_AhA9K66?dcS|f5Rtr<`{vA`^YriSV%rlLB#V1I8`i$qL z@(g^J;onMG0ap=6~UZb>2ISV`fx_r9(O*`2vh-PjI8{f0Fu z+@{!Dwf*a)A`_i|64ItW=wo$Bg|?`s1I~CgI_|7C#s#Jo$?w}2BB|&Z&o8WsFo#KL`a5}5LZ9Bg-}?3x9fiaDPAC>G#UA^y zCtP$lh_9my`#_@aP-Q+;NAiQ!{vxJ1nAq zJ6@fng6C(zl1V-~Hg0jsFpV@jqh&VTW zBoJ}vrwf!7L#$-n3H(-AyXG0c5(I;^O9w8~A$f?q(LYlc$1BT6vcpz^%rfI_Ch(rK_}$%$%xRpS*SY8!{#UAhoR{$s@tkek=n6nwp7vqvvP;;rD-zYLX&#&vz(67 zriUu&p895iS3a2nLK@h%~9GGCJeX^~T&BfFXC|J3VUl*Bc=P4@vb!uyWyjvK$sKW25SOMD3kz zR+wt}u`aL30f!b=mPV~%!Gn3Lb6!ykw8G9e=PK>7Ci#1z+yg4MsIQ$gFJ+^k?!uw2 zX=Uuyy!$$ zbDA|ar%Pz12$yT8uH%yGaC9#lK@?aKKhS32rV4AysZE-c5dy zeq75tM5N`U<Zr#V@!V6)i2>I%kk z_Ei~yEY23^%8QPV_Ca1Wba=>M9$#e1|4?ORSu9rg^fh|$#kqI?cM|&l2|o9(-Lo35 z+WQgU*$UGHRg&mzLabFHY((=h72b?|zhtmBMd6E#KV9SHK&zLH{2D*}nl!?EEM1D% zo70ifuTICtS`js`94e}fcw?=LpTZ5vRBIKDz3WEyz8K2vD?`kzOgbE128HjN(SJu2 zbswrA8gGWeXAP7aIb#K{A1of~e;j?(D(A^bbHj3=&EK?@sV za8cG2O$rxqd37g(v-ChC`ziXC8XS}>p`R*AsuDK%dL*5C?iqtu^@8?mctN^knAtU< zh!3ALq206$H{KM$DenyQyJjGpdy;M@Wl_TCV0?Jy&Zy3x4<++5w7qZw^Kl=3H5_6@ z6moHGAO(HqtFTCB8#e!L4FyvjxOp>BHC4v)J3Fy{PBz?j|3Z2_i>b3+4EyaXVW0Pk z;jTG{dzNf?+_**2SvSe&&>0jLS;8qy6)x(95DHdd7TgRboxjV_w;~nny;V5ALKU+6 zG?_iM4tShiM~WlO^!8yMJ>B&ygmt$-RLl$a)6{8Kg9Pe77U1>u6#5WahwP*%Y^ilb z(NaEEC@7Kg>>^aepC?&=KK2>;qFnV9S{;i}dbkr=V~Xgz--frxWAXc^VoFO#*QpOf81$I zDm8)|T8xzOU{u(N<9Yl5g^QIS^4@&tDtf|J#-8y$Fig>lN>Mde3Y`~JVbz_36N3)0 zKcI!0)s;A!_MEzMYiQ`ndE_@|p>#4A_FB7$Usr|0X1nob3b-<-2MhME!_lb%B-R|E zyX<9Xx-7#~eEbPYuZC%-O$MHHCt|rvD3rw(VXxU0Vx}CaS2z-0pGtA4dI@Y!ZlkJA zmM~dZkLR}Wlz8(Ni4?~nW$$y|)|iv{`R+E{+`Eo03KwH@?p{Q#zeDrh4l~zI?SLys z1#X`ZP9Z9?_iCy%ws6F|<9-^_8*J*iQHEw&SLE)VjCUkwU-XIkB zg<^5CVI#I%?7^e^jgTuS!-6OcI1>jIS~*yL#0+6qm%uA&CWgghsj;O4mbvM$2@xf+ zgxS;!Uxcj8!Lq%#nXx7X`0Xo0$eYLX&~O$^7BoS9AQgv9`S4llkKxqah#ENuzQ=mJ zJsSfWY)8$GvxsHcQDg++(&Q-`nz%u}X+})dz##eNMbbwJFIbwEgKhj9#uGPzBi(_9 zHZP=~76Vxaqd}14c%1?M?EDU+J};TZCItMhD##?2wGLq+fpY(juXCr-2S zp&>2Emz#jkdsjkVA%px|rKtS89qdkYpswl|p82N1BO@Fy%!<&^6^;2re5Cp(Am&jR z;udy8xUG-$E9;@yvjKJQYANkR0&?PdV5CsO^nQ%RpH_z$E30JYz`|rSNw;A7Cvh!+ zPg$0ZXf`$gi_?TE;}684?acFoiE!6VgWUZIGM3As=mS5J_UiKpuU`Vc+ii%iF@UK^ zCXTvQVz{7&X_~bfeMVo&K7OO^xY%d0tB$?Kif_HIO1}#h9hVe`ea$;Ih-&Ft` z`Fo81(LOvfmPXFea%P54Hg=zyNvZihjNv2?c~5!ZvkqcoTQ$PA-=evL-6%3w!p!D5 zWTBt|nsS{S`R>OF!Z1g!ZI^dC1I{Gwc&=~hV z#VcMS)46PzE)eErTpl294Ij}8c}&&zO^A@PMu}%9V%2KNS6!QKmBwLD{v?yIwHN&c z73jF#&0Nl?h3q;8VP2+4dFzQ&FHS<{unT@ungJEh7`%#>%@!jJ}xD;HcJ1sSk zi8P1ap#oelszQibo&OxmEL^lM{-FFSc-QE5^L3Tx7?XP;uo0D$>outFh<2(~)*qk==|P1Ye`lg6IuhGd&1r7g zF+BF=V3qws<~3`G2{bv0T3;b_ot4AvfDIUt%R#@;C2A>;!*rReY!XK29^WRPeQVL{ z*@vlLmLW1ql_XPik#M5|h69%1z0HT3b_wFz5|DqqmbQK_!=?cdI?T_(7pZ1?|2PVx zDwdR-dza ze>Zwk-_zx@s<=OR8om$ssDIl;ca~)$Wpg31VZ=NvsDiC^6gcj4QN(e=;;~9h7hiPVWwdK-!@IDEP+n4!6UC-+++RP{!>J zAJ2YZ;QCO5YJ%Nq=tLKF2Q8)o2N!65ai+Nn&w1)8Mo`-jge;?SS{0TAc{eHOF3p9$ zN(j$^*M^gs!l-1M!S%E?6pu<%Q)De7L`3ObxD}%~eiBg!J~FSm6%jGa!cIFYG7h_d zS2cx{`zRiVixVKFSO~T-XZb3Yy!ZiUw>|rv*upHfq?)k2sEd=o6Kmd884j1jRcCS8 zk{mU07Uv&3d)hJYFI~Y68|Xo&5Z~gOmgJ_#JTf_EKKCQcFimhr{Ix_UtCaVwnrN)c*n*m`k1j literal 0 HcmV?d00001 diff --git a/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/data/vectorized/parquet/TestParquetVectorizedReads.java b/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/data/vectorized/parquet/TestParquetVectorizedReads.java index 6e823a8bfc05..a3ca1fe9fc4b 100644 --- a/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/data/vectorized/parquet/TestParquetVectorizedReads.java +++ b/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/data/vectorized/parquet/TestParquetVectorizedReads.java @@ -81,7 +81,8 @@ public class TestParquetVectorizedReads extends AvroDataTestBase { private static final String PLAIN = "PLAIN"; private static final List GOLDEN_FILE_ENCODINGS = - ImmutableList.of("PLAIN_DICTIONARY", "RLE_DICTIONARY", "DELTA_BINARY_PACKED"); + ImmutableList.of( + "PLAIN_DICTIONARY", "RLE_DICTIONARY", "DELTA_BINARY_PACKED", "BYTE_STREAM_SPLIT"); private static final Map GOLDEN_FILE_TYPES = ImmutableMap.of( "string", Types.StringType.get(), @@ -89,7 +90,8 @@ public class TestParquetVectorizedReads extends AvroDataTestBase { "int32", Types.IntegerType.get(), "int64", Types.LongType.get(), "binary", Types.BinaryType.get(), - "boolean", Types.BooleanType.get()); + "boolean", Types.BooleanType.get(), + "double", Types.DoubleType.get()); static final Function IDENTITY = record -> record; @@ -504,10 +506,16 @@ static Stream goldenFilesAndEncodings() { .flatMap( e -> Stream.of(true, false) - .map( + .flatMap( vectorized -> - Arguments.of( - encoding, e.getKey(), e.getValue(), vectorized)))); + Stream.of( + Arguments.of( + encoding, e.getKey(), e.getValue(), vectorized), + Arguments.of( + encoding, + e.getKey() + "_with_nulls", + e.getValue(), + vectorized))))); } private File resourceUrlToLocalFile(URL url) throws IOException, URISyntaxException { diff --git a/spark/v4.0/spark/src/test/java/org/apache/iceberg/spark/data/vectorized/parquet/TestParquetVectorizedReads.java b/spark/v4.0/spark/src/test/java/org/apache/iceberg/spark/data/vectorized/parquet/TestParquetVectorizedReads.java index 46a6a302e1c4..89368e23f731 100644 --- a/spark/v4.0/spark/src/test/java/org/apache/iceberg/spark/data/vectorized/parquet/TestParquetVectorizedReads.java +++ b/spark/v4.0/spark/src/test/java/org/apache/iceberg/spark/data/vectorized/parquet/TestParquetVectorizedReads.java @@ -81,7 +81,8 @@ public class TestParquetVectorizedReads extends AvroDataTestBase { private static final String PLAIN = "PLAIN"; private static final List GOLDEN_FILE_ENCODINGS = - ImmutableList.of("PLAIN_DICTIONARY", "RLE_DICTIONARY", "DELTA_BINARY_PACKED"); + ImmutableList.of( + "PLAIN_DICTIONARY", "RLE_DICTIONARY", "DELTA_BINARY_PACKED", "BYTE_STREAM_SPLIT"); private static final Map GOLDEN_FILE_TYPES = ImmutableMap.of( "string", Types.StringType.get(), @@ -89,7 +90,8 @@ public class TestParquetVectorizedReads extends AvroDataTestBase { "int32", Types.IntegerType.get(), "int64", Types.LongType.get(), "binary", Types.BinaryType.get(), - "boolean", Types.BooleanType.get()); + "boolean", Types.BooleanType.get(), + "double", Types.DoubleType.get()); static final Function IDENTITY = record -> record; @@ -490,10 +492,16 @@ static Stream goldenFilesAndEncodings() { .flatMap( e -> Stream.of(true, false) - .map( + .flatMap( vectorized -> - Arguments.of( - encoding, e.getKey(), e.getValue(), vectorized)))); + Stream.of( + Arguments.of( + encoding, e.getKey(), e.getValue(), vectorized), + Arguments.of( + encoding, + e.getKey() + "_with_nulls", + e.getValue(), + vectorized))))); } private File resourceUrlToLocalFile(URL url) throws IOException, URISyntaxException {