This is an automated email from the ASF dual-hosted git repository.
fokko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/parquet-java.git
The following commit(s) were added to refs/heads/master by this push:
new bcf5abcbc GH-3086: Allow for empty beans (#3087)
bcf5abcbc is described below
commit bcf5abcbc9d8dbfe5110ef2cfc095e04a7e5ad46
Author: Fokko Driesprong <[email protected]>
AuthorDate: Thu Nov 28 22:56:30 2024 +0100
GH-3086: Allow for empty beans (#3087)
---
.../format/converter/ParquetMetadataConverter.java | 4 +-
.../parquet/hadoop/metadata/ParquetMetadata.java | 6 +-
.../hadoop/metadata/TestParquetMetadata.java | 113 +++++
.../resources/test-expected-parquet-metadata.json | 500 +++++++++++++++++++++
4 files changed, 620 insertions(+), 3 deletions(-)
diff --git
a/parquet-hadoop/src/main/java/org/apache/parquet/format/converter/ParquetMetadataConverter.java
b/parquet-hadoop/src/main/java/org/apache/parquet/format/converter/ParquetMetadataConverter.java
index bb9e58b7a..d1c6b01c9 100644
---
a/parquet-hadoop/src/main/java/org/apache/parquet/format/converter/ParquetMetadataConverter.java
+++
b/parquet-hadoop/src/main/java/org/apache/parquet/format/converter/ParquetMetadataConverter.java
@@ -1591,7 +1591,9 @@ public class ParquetMetadataConverter {
ParquetMetadata parquetMetadata =
fromParquetMetadata(fileMetaData, fileDecryptor, encryptedFooter,
rowGroupToRowIndexOffsetMap);
- if (LOG.isDebugEnabled())
LOG.debug(ParquetMetadata.toPrettyJSON(parquetMetadata));
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(ParquetMetadata.toPrettyJSON(parquetMetadata));
+ }
return parquetMetadata;
}
diff --git
a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/metadata/ParquetMetadata.java
b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/metadata/ParquetMetadata.java
index 1709303a9..4f6b1cc5e 100755
---
a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/metadata/ParquetMetadata.java
+++
b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/metadata/ParquetMetadata.java
@@ -20,6 +20,7 @@ package org.apache.parquet.hadoop.metadata;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.databind.SerializationFeature;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
@@ -27,11 +28,12 @@ import java.util.List;
/**
* Metadata block stored in the footer of the file
- * contains file level (Codec, Schema, ...) and block level (location,
columns, record count, ...) meta data
+ * contains file level (Codec, Schema, ...) and block level (location,
columns, record count, ...) metadata
*/
public class ParquetMetadata {
- private static final ObjectMapper objectMapper = new ObjectMapper();
+ private static final ObjectMapper objectMapper =
+ new ObjectMapper().configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,
false);
/**
* @param parquetMetaData an instance of parquet metadata to convert
diff --git
a/parquet-hadoop/src/test/java/org/apache/parquet/hadoop/metadata/TestParquetMetadata.java
b/parquet-hadoop/src/test/java/org/apache/parquet/hadoop/metadata/TestParquetMetadata.java
new file mode 100644
index 000000000..7ae3b1631
--- /dev/null
+++
b/parquet-hadoop/src/test/java/org/apache/parquet/hadoop/metadata/TestParquetMetadata.java
@@ -0,0 +1,113 @@
+/*
+ * 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.parquet.hadoop.metadata;
+
+import static org.apache.parquet.schema.LogicalTypeAnnotation.TimeUnit.MICROS;
+import static org.apache.parquet.schema.LogicalTypeAnnotation.TimeUnit.MILLIS;
+import static org.apache.parquet.schema.LogicalTypeAnnotation.TimeUnit.NANOS;
+import static org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName.BINARY;
+import static
org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName.FIXED_LEN_BYTE_ARRAY;
+import static org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName.FLOAT;
+import static org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName.INT32;
+import static org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName.INT64;
+import static org.junit.Assert.assertEquals;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Collections;
+import org.apache.parquet.schema.LogicalTypeAnnotation;
+import org.apache.parquet.schema.MessageType;
+import org.apache.parquet.schema.Types;
+import org.junit.Test;
+
+public class TestParquetMetadata {
+ private static final String EXPECTED_JSON =
"/test-expected-parquet-metadata.json";
+
+ // Use an object mapper, since order of the keys might differ in JSON maps,
+ // and we don't want to sort them because of testing
+ private static final ObjectMapper mapper = new ObjectMapper();
+
+ private static JsonNode expectedJson() throws IOException,
URISyntaxException {
+ URI path = TestParquetMetadata.class.getResource(EXPECTED_JSON).toURI();
+ return mapper.readTree(path.toURL());
+ }
+
+ @Test
+ public void testToPrettyJSON() throws IOException, URISyntaxException {
+ MessageType complexParquetSchema = Types.buildMessage()
+ .addField(Types.optional(INT32)
+ .as(LogicalTypeAnnotation.intType(8))
+ .named("a"))
+ .addField(Types.optionalGroup()
+ .addField(Types.optional(INT32)
+ .as(LogicalTypeAnnotation.intType(16))
+ .named("c"))
+ .addField(Types.optional(BINARY)
+ .as(LogicalTypeAnnotation.stringType())
+ .named("d"))
+ .named("b"))
+ .addField(Types.optionalList()
+ .setElementType(Types.optional(INT32)
+ .as(LogicalTypeAnnotation.dateType())
+ .named("element"))
+ .named("e"))
+ .addField(Types.optionalList()
+ .setElementType(Types.optional(INT32)
+ .as(LogicalTypeAnnotation.dateType())
+ .named("element"))
+ .named("f"))
+ .addField(Types.optional(FLOAT).named("g"))
+ .addField(Types.optional(INT64)
+ .as(LogicalTypeAnnotation.timestampType(true, MILLIS))
+ .named("h"))
+ .addField(Types.optional(INT64)
+ .as(LogicalTypeAnnotation.timestampType(true, NANOS))
+ .named("i"))
+ .addField(Types.optional(INT64)
+ .as(LogicalTypeAnnotation.timestampType(false, MILLIS))
+ .named("j"))
+ .addField(Types.optional(INT64)
+ .as(LogicalTypeAnnotation.timestampType(true, MICROS))
+ .named("k"))
+ .addField(Types.optional(INT64)
+ .as(LogicalTypeAnnotation.timestampType(false, MICROS))
+ .named("l"))
+ .addField(Types.optional(FIXED_LEN_BYTE_ARRAY)
+ .length(12)
+ .as(LogicalTypeAnnotation.intervalType())
+ .named("m"))
+ .addField(Types.optionalMap()
+ .key(Types.optional(INT32)
+ .as(LogicalTypeAnnotation.dateType())
+ .named("key"))
+ .value(Types.optional(BINARY)
+ .as(LogicalTypeAnnotation.stringType())
+ .named("value"))
+ .named("list"))
+ .named("root");
+
+ FileMetaData fmd = new FileMetaData(complexParquetSchema,
Collections.emptyMap(), "ASF");
+ String prettyJSon = ParquetMetadata.toPrettyJSON(new ParquetMetadata(fmd,
Collections.emptyList()));
+
+ assertEquals(mapper.readTree(prettyJSon), expectedJson());
+ }
+}
diff --git
a/parquet-hadoop/src/test/resources/test-expected-parquet-metadata.json
b/parquet-hadoop/src/test/resources/test-expected-parquet-metadata.json
new file mode 100644
index 000000000..fad63f4ac
--- /dev/null
+++ b/parquet-hadoop/src/test/resources/test-expected-parquet-metadata.json
@@ -0,0 +1,500 @@
+{
+ "schema" : {
+ "name" : "root",
+ "repetition" : "REPEATED",
+ "logicalTypeAnnotation" : null,
+ "id" : null,
+ "fields" : [ {
+ "name" : "a",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "bitWidth" : 8,
+ "signed" : true
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT32",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "INT_8"
+ }, {
+ "name" : "b",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : null,
+ "id" : null,
+ "fields" : [ {
+ "name" : "c",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "bitWidth" : 16,
+ "signed" : true
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT32",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "INT_16"
+ }, {
+ "name" : "d",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "BINARY",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "UTF8"
+ } ],
+ "primitive" : false,
+ "fieldCount" : 2,
+ "originalType" : null
+ }, {
+ "name" : "e",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "fields" : [ {
+ "name" : "list",
+ "repetition" : "REPEATED",
+ "logicalTypeAnnotation" : null,
+ "id" : null,
+ "fields" : [ {
+ "name" : "element",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT32",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "DATE"
+ } ],
+ "primitive" : false,
+ "fieldCount" : 1,
+ "originalType" : null
+ } ],
+ "primitive" : false,
+ "fieldCount" : 1,
+ "originalType" : "LIST"
+ }, {
+ "name" : "f",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "fields" : [ {
+ "name" : "list",
+ "repetition" : "REPEATED",
+ "logicalTypeAnnotation" : null,
+ "id" : null,
+ "fields" : [ {
+ "name" : "element",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT32",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "DATE"
+ } ],
+ "primitive" : false,
+ "fieldCount" : 1,
+ "originalType" : null
+ } ],
+ "primitive" : false,
+ "fieldCount" : 1,
+ "originalType" : "LIST"
+ }, {
+ "name" : "g",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : null,
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "FLOAT",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : null
+ }, {
+ "name" : "h",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "unit" : "MILLIS",
+ "adjustedToUTC" : true
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT64",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "TIMESTAMP_MILLIS"
+ }, {
+ "name" : "i",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "unit" : "NANOS",
+ "adjustedToUTC" : true
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT64",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : null
+ }, {
+ "name" : "j",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "unit" : "MILLIS",
+ "adjustedToUTC" : false
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT64",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "TIMESTAMP_MILLIS"
+ }, {
+ "name" : "k",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "unit" : "MICROS",
+ "adjustedToUTC" : true
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT64",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "TIMESTAMP_MICROS"
+ }, {
+ "name" : "l",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "unit" : "MICROS",
+ "adjustedToUTC" : false
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT64",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "TIMESTAMP_MICROS"
+ }, {
+ "name" : "m",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "FIXED_LEN_BYTE_ARRAY",
+ "typeLength" : 12,
+ "decimalMetadata" : null,
+ "originalType" : "INTERVAL"
+ }, {
+ "name" : "list",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "fields" : [ {
+ "name" : "key_value",
+ "repetition" : "REPEATED",
+ "logicalTypeAnnotation" : null,
+ "id" : null,
+ "fields" : [ {
+ "name" : "key",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT32",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "DATE"
+ }, {
+ "name" : "value",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "BINARY",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "UTF8"
+ } ],
+ "primitive" : false,
+ "fieldCount" : 2,
+ "originalType" : null
+ } ],
+ "primitive" : false,
+ "fieldCount" : 1,
+ "originalType" : "MAP"
+ } ],
+ "paths" : [ [ "a" ], [ "b", "c" ], [ "b", "d" ], [ "e", "list", "element"
], [ "f", "list", "element" ], [ "g" ], [ "h" ], [ "i" ], [ "j" ], [ "k" ], [
"l" ], [ "m" ], [ "list", "key_value", "key" ], [ "list", "key_value", "value"
] ],
+ "columns" : [ {
+ "path" : [ "a" ],
+ "type" : "INT32",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 0,
+ "maxDefinitionLevel" : 1,
+ "primitiveType" : {
+ "name" : "a",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "bitWidth" : 8,
+ "signed" : true
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT32",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "INT_8"
+ }
+ }, {
+ "path" : [ "b", "c" ],
+ "type" : "INT32",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 0,
+ "maxDefinitionLevel" : 2,
+ "primitiveType" : {
+ "name" : "c",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "bitWidth" : 16,
+ "signed" : true
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT32",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "INT_16"
+ }
+ }, {
+ "path" : [ "b", "d" ],
+ "type" : "BINARY",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 0,
+ "maxDefinitionLevel" : 2,
+ "primitiveType" : {
+ "name" : "d",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "BINARY",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "UTF8"
+ }
+ }, {
+ "path" : [ "e", "list", "element" ],
+ "type" : "INT32",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 1,
+ "maxDefinitionLevel" : 3,
+ "primitiveType" : {
+ "name" : "element",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT32",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "DATE"
+ }
+ }, {
+ "path" : [ "f", "list", "element" ],
+ "type" : "INT32",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 1,
+ "maxDefinitionLevel" : 3,
+ "primitiveType" : {
+ "name" : "element",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT32",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "DATE"
+ }
+ }, {
+ "path" : [ "g" ],
+ "type" : "FLOAT",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 0,
+ "maxDefinitionLevel" : 1,
+ "primitiveType" : {
+ "name" : "g",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : null,
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "FLOAT",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : null
+ }
+ }, {
+ "path" : [ "h" ],
+ "type" : "INT64",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 0,
+ "maxDefinitionLevel" : 1,
+ "primitiveType" : {
+ "name" : "h",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "unit" : "MILLIS",
+ "adjustedToUTC" : true
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT64",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "TIMESTAMP_MILLIS"
+ }
+ }, {
+ "path" : [ "i" ],
+ "type" : "INT64",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 0,
+ "maxDefinitionLevel" : 1,
+ "primitiveType" : {
+ "name" : "i",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "unit" : "NANOS",
+ "adjustedToUTC" : true
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT64",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : null
+ }
+ }, {
+ "path" : [ "j" ],
+ "type" : "INT64",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 0,
+ "maxDefinitionLevel" : 1,
+ "primitiveType" : {
+ "name" : "j",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "unit" : "MILLIS",
+ "adjustedToUTC" : false
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT64",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "TIMESTAMP_MILLIS"
+ }
+ }, {
+ "path" : [ "k" ],
+ "type" : "INT64",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 0,
+ "maxDefinitionLevel" : 1,
+ "primitiveType" : {
+ "name" : "k",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "unit" : "MICROS",
+ "adjustedToUTC" : true
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT64",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "TIMESTAMP_MICROS"
+ }
+ }, {
+ "path" : [ "l" ],
+ "type" : "INT64",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 0,
+ "maxDefinitionLevel" : 1,
+ "primitiveType" : {
+ "name" : "l",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : {
+ "unit" : "MICROS",
+ "adjustedToUTC" : false
+ },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT64",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "TIMESTAMP_MICROS"
+ }
+ }, {
+ "path" : [ "m" ],
+ "type" : "FIXED_LEN_BYTE_ARRAY",
+ "typeLength" : 12,
+ "maxRepetitionLevel" : 0,
+ "maxDefinitionLevel" : 1,
+ "primitiveType" : {
+ "name" : "m",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "FIXED_LEN_BYTE_ARRAY",
+ "typeLength" : 12,
+ "decimalMetadata" : null,
+ "originalType" : "INTERVAL"
+ }
+ }, {
+ "path" : [ "list", "key_value", "key" ],
+ "type" : "INT32",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 1,
+ "maxDefinitionLevel" : 3,
+ "primitiveType" : {
+ "name" : "key",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "INT32",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "DATE"
+ }
+ }, {
+ "path" : [ "list", "key_value", "value" ],
+ "type" : "BINARY",
+ "typeLength" : 0,
+ "maxRepetitionLevel" : 1,
+ "maxDefinitionLevel" : 3,
+ "primitiveType" : {
+ "name" : "value",
+ "repetition" : "OPTIONAL",
+ "logicalTypeAnnotation" : { },
+ "id" : null,
+ "primitive" : true,
+ "primitiveTypeName" : "BINARY",
+ "typeLength" : 0,
+ "decimalMetadata" : null,
+ "originalType" : "UTF8"
+ }
+ } ],
+ "primitive" : false,
+ "fieldCount" : 12,
+ "originalType" : null
+ },
+ "keyValueMetaData" : { },
+ "createdBy" : "ASF",
+ "encryptionType" : null
+}