4242import static org .apache .parquet .schema .Type .Repetition .REQUIRED ;
4343
4444import java .util .ArrayList ;
45+ import java .util .Collections ;
4546import java .util .List ;
4647import java .util .Optional ;
4748
6465import org .apache .arrow .vector .types .pojo .ArrowType .Union ;
6566import org .apache .arrow .vector .types .pojo .ArrowType .Utf8 ;
6667import org .apache .arrow .vector .types .pojo .Field ;
68+ import org .apache .arrow .vector .types .pojo .FieldType ;
6769import org .apache .arrow .vector .types .pojo .Schema ;
6870import org .apache .parquet .arrow .schema .SchemaMapping .ListTypeMapping ;
6971import org .apache .parquet .arrow .schema .SchemaMapping .PrimitiveTypeMapping ;
@@ -158,6 +160,11 @@ public TypeMapping visit(org.apache.arrow.vector.types.pojo.ArrowType.List type)
158160 return createListTypeMapping ();
159161 }
160162
163+ @ Override
164+ public TypeMapping visit (ArrowType .LargeList largeList ) {
165+ return createListTypeMapping ();
166+ }
167+
161168 @ Override
162169 public TypeMapping visit (org .apache .arrow .vector .types .pojo .ArrowType .FixedSizeList type ) {
163170 return createListTypeMapping ();
@@ -179,6 +186,17 @@ public TypeMapping visit(Union type) {
179186 return new UnionTypeMapping (field , addToBuilder (parquetTypes , Types .buildGroup (OPTIONAL )).named (fieldName ), parquetTypes );
180187 }
181188
189+ @ Override
190+ public TypeMapping visit (ArrowType .Map map ) {
191+ if (children .size () != 2 ) {
192+ throw new IllegalArgumentException ("Map fields must have exactly two children: " + field );
193+ }
194+ TypeMapping keyChild = fromArrow (children .get (0 ), "key" );
195+ TypeMapping valueChild = fromArrow (children .get (1 ), "value" );
196+ GroupType groupType = Types .optionalMap ().key (keyChild .getParquetType ()).value (valueChild .getParquetType ()).named (fieldName );
197+ return new SchemaMapping .MapTypeMapping (field , new Map3Levels (groupType ), keyChild , valueChild );
198+ }
199+
182200 @ Override
183201 public TypeMapping visit (Int type ) {
184202 boolean signed = type .getIsSigned ();
@@ -214,11 +232,21 @@ public TypeMapping visit(Utf8 type) {
214232 return primitive (BINARY , stringType ());
215233 }
216234
235+ @ Override
236+ public TypeMapping visit (ArrowType .LargeUtf8 largeUtf8 ) {
237+ return primitive (BINARY , stringType ());
238+ }
239+
217240 @ Override
218241 public TypeMapping visit (Binary type ) {
219242 return primitive (BINARY );
220243 }
221244
245+ @ Override
246+ public TypeMapping visit (ArrowType .LargeBinary largeBinary ) {
247+ return primitive (BINARY );
248+ }
249+
222250 @ Override
223251 public TypeMapping visit (Bool type ) {
224252 return primitive (BOOLEAN );
@@ -289,6 +317,16 @@ public TypeMapping visit(Interval type) {
289317 return primitiveFLBA (12 , LogicalTypeAnnotation .IntervalLogicalTypeAnnotation .getInstance ());
290318 }
291319
320+ @ Override
321+ public TypeMapping visit (ArrowType .Duration duration ) {
322+ return primitiveFLBA (12 , LogicalTypeAnnotation .IntervalLogicalTypeAnnotation .getInstance ());
323+ }
324+
325+ @ Override
326+ public TypeMapping visit (ArrowType .ExtensionType type ) {
327+ return ArrowTypeVisitor .super .visit (type );
328+ }
329+
292330 @ Override
293331 public TypeMapping visit (ArrowType .FixedSizeBinary fixedSizeBinary ) {
294332 return primitive (BINARY );
@@ -358,7 +396,7 @@ private TypeMapping fromParquet(Type type, String name, Repetition repetition) {
358396 if (repetition == REPEATED ) {
359397 // case where we have a repeated field that is not in a List/Map
360398 TypeMapping child = fromParquet (type , null , REQUIRED );
361- Field arrowField = new Field (name , false , new ArrowType .List (), asList (child .getArrowField ()));
399+ Field arrowField = new Field (name , FieldType . notNullable ( new ArrowType .List ()), Collections . singletonList (child .getArrowField ()));
362400 return new RepeatedTypeMapping (arrowField , type , child );
363401 }
364402 if (type .isPrimitive ()) {
@@ -376,18 +414,32 @@ private TypeMapping fromParquet(Type type, String name, Repetition repetition) {
376414 private TypeMapping fromParquetGroup (GroupType type , String name ) {
377415 LogicalTypeAnnotation logicalType = type .getLogicalTypeAnnotation ();
378416 if (logicalType == null ) {
417+ final FieldType field ;
418+ if (type .isRepetition (OPTIONAL )) {
419+ field = FieldType .nullable (new Struct ());
420+ } else {
421+ field = FieldType .notNullable (new Struct ());
422+ }
379423 List <TypeMapping > typeMappings = fromParquet (type .getFields ());
380- Field arrowField = new Field (name , type . isRepetition ( OPTIONAL ), new Struct () , fields (typeMappings ));
424+ Field arrowField = new Field (name , field , fields (typeMappings ));
381425 return new StructTypeMapping (arrowField , type , typeMappings );
382426 } else {
383427 return logicalType .accept (new LogicalTypeAnnotation .LogicalTypeAnnotationVisitor <TypeMapping >() {
384428 @ Override
385429 public Optional <TypeMapping > visit (LogicalTypeAnnotation .ListLogicalTypeAnnotation listLogicalType ) {
386430 List3Levels list3Levels = new List3Levels (type );
387431 TypeMapping child = fromParquet (list3Levels .getElement (), null , list3Levels .getElement ().getRepetition ());
388- Field arrowField = new Field (name , type . isRepetition ( OPTIONAL ), new ArrowType .List (), asList (child .getArrowField ()));
432+ Field arrowField = new Field (name , FieldType . nullable ( new ArrowType .List ()), Collections . singletonList (child .getArrowField ()));
389433 return of (new ListTypeMapping (arrowField , list3Levels , child ));
390434 }
435+ @ Override
436+ public Optional <TypeMapping > visit (LogicalTypeAnnotation .MapLogicalTypeAnnotation mapLogicalType ) {
437+ Map3Levels map3levels = new Map3Levels (type );
438+ TypeMapping keyType = fromParquet (map3levels .getKey (), null , map3levels .getKey ().getRepetition ());
439+ TypeMapping valueType = fromParquet (map3levels .getValue (), null , map3levels .getValue ().getRepetition ());
440+ Field arrowField = new Field (name , FieldType .nullable (new ArrowType .Map (false )), asList (keyType .getArrowField (), valueType .getArrowField ()));
441+ return of (new SchemaMapping .MapTypeMapping (arrowField , map3levels , keyType , valueType ));
442+ }
391443 }).orElseThrow (() -> new UnsupportedOperationException ("Unsupported type " + type ));
392444 }
393445 }
@@ -401,7 +453,12 @@ private TypeMapping fromParquetPrimitive(final PrimitiveType type, final String
401453 return type .getPrimitiveTypeName ().convert (new PrimitiveType .PrimitiveTypeNameConverter <TypeMapping , RuntimeException >() {
402454
403455 private TypeMapping field (ArrowType arrowType ) {
404- Field field = new Field (name , type .isRepetition (OPTIONAL ), arrowType , null );
456+ final Field field ;
457+ if (type .isRepetition (OPTIONAL )) {
458+ field = Field .nullable (name , arrowType );
459+ } else {
460+ field = Field .notNullable (name , arrowType );
461+ }
405462 return new PrimitiveTypeMapping (field , type );
406463 }
407464
@@ -607,6 +664,11 @@ public TypeMapping visit(org.apache.arrow.vector.types.pojo.ArrowType.List type)
607664 return createListTypeMapping (type );
608665 }
609666
667+ @ Override
668+ public TypeMapping visit (ArrowType .LargeList largeList ) {
669+ return createListTypeMapping (largeList );
670+ }
671+
610672 @ Override
611673 public TypeMapping visit (org .apache .arrow .vector .types .pojo .ArrowType .FixedSizeList type ) {
612674 return createListTypeMapping (type );
@@ -639,6 +701,26 @@ public TypeMapping visit(Union type) {
639701 return new UnionTypeMapping (arrowField , groupType , map (arrowField .getChildren (), groupType .getFields ()));
640702 }
641703
704+ @ Override
705+ public TypeMapping visit (ArrowType .Map map ) {
706+ if (arrowField .getChildren ().size () != 2 ) {
707+ throw new IllegalArgumentException ("Invalid map type: " + map );
708+ }
709+ if (parquetField .isPrimitive ()) {
710+ throw new IllegalArgumentException ("Parquet type not a group: " + parquetField );
711+ }
712+ Map3Levels map3levels = new Map3Levels (parquetField .asGroupType ());
713+ if (arrowField .getChildren ().size () != 2 ) {
714+ throw new IllegalArgumentException ("invalid arrow map: " + arrowField );
715+ }
716+ Field keyChild = arrowField .getChildren ().get (0 );
717+ Field valueChild = arrowField .getChildren ().get (1 );
718+ return new SchemaMapping .MapTypeMapping (arrowField , map3levels ,
719+ map (keyChild , map3levels .getKey ()),
720+ map (valueChild , map3levels .getValue ())
721+ );
722+ }
723+
642724 @ Override
643725 public TypeMapping visit (Int type ) {
644726 return primitive ();
@@ -654,11 +736,21 @@ public TypeMapping visit(Utf8 type) {
654736 return primitive ();
655737 }
656738
739+ @ Override
740+ public TypeMapping visit (ArrowType .LargeUtf8 largeUtf8 ) {
741+ return primitive ();
742+ }
743+
657744 @ Override
658745 public TypeMapping visit (Binary type ) {
659746 return primitive ();
660747 }
661748
749+ @ Override
750+ public TypeMapping visit (ArrowType .LargeBinary largeBinary ) {
751+ return primitive ();
752+ }
753+
662754 @ Override
663755 public TypeMapping visit (Bool type ) {
664756 return primitive ();
@@ -689,6 +781,11 @@ public TypeMapping visit(Interval type) {
689781 return primitive ();
690782 }
691783
784+ @ Override
785+ public TypeMapping visit (ArrowType .Duration duration ) {
786+ return primitive ();
787+ }
788+
692789 @ Override
693790 public TypeMapping visit (ArrowType .FixedSizeBinary fixedSizeBinary ) {
694791 return primitive ();
0 commit comments