davisusanibar commented on code in PR #215:
URL: https://github.com/apache/arrow-cookbook/pull/215#discussion_r880858786


##########
java/source/io.rst:
##########
@@ -443,3 +443,108 @@ Reading Parquet File
 ********************
 
 Please check :doc:`Dataset <./dataset>`
+
+Dictionary-encoded Layout
+=========================
+
+In some scenarios could be more appropriate use `Dictionary-encoded Layout`_ 
to encoded data which takes much less space.
+
+.. testcode::
+
+    import org.apache.arrow.memory.BufferAllocator;
+    import org.apache.arrow.memory.RootAllocator;
+    import org.apache.arrow.vector.FieldVector;
+    import org.apache.arrow.vector.ValueVector;
+    import org.apache.arrow.vector.VarCharVector;
+    import org.apache.arrow.vector.VectorSchemaRoot;
+    import org.apache.arrow.vector.dictionary.Dictionary;
+    import org.apache.arrow.vector.dictionary.DictionaryEncoder;
+    import org.apache.arrow.vector.dictionary.DictionaryProvider;
+    import org.apache.arrow.vector.ipc.ArrowFileReader;
+    import org.apache.arrow.vector.ipc.ArrowFileWriter;
+    import org.apache.arrow.vector.ipc.message.ArrowBlock;
+    import org.apache.arrow.vector.types.pojo.DictionaryEncoding;
+
+    import java.io.File;
+    import java.io.FileInputStream;
+    import java.io.FileNotFoundException;
+    import java.io.FileOutputStream;
+    import java.io.IOException;
+    import java.nio.charset.StandardCharsets;
+
+    try (BufferAllocator root = new RootAllocator();
+         VarCharVector countries = new VarCharVector("country-dict", root);
+         VarCharVector myAppUseCountryDictionary = new 
VarCharVector("app-use-country-dict", root)
+    ) {
+        countries.allocateNew(10);
+        countries.set(0, "Andorra".getBytes(StandardCharsets.UTF_8));
+        countries.set(1, "Cuba".getBytes(StandardCharsets.UTF_8));
+        countries.set(2, "Grecia".getBytes(StandardCharsets.UTF_8));
+        countries.set(3, "Guinea".getBytes(StandardCharsets.UTF_8));
+        countries.set(4, "Islandia".getBytes(StandardCharsets.UTF_8));
+        countries.set(5, "Malta".getBytes(StandardCharsets.UTF_8));
+        countries.set(6, "Tailandia".getBytes(StandardCharsets.UTF_8));
+        countries.set(7, "Uganda".getBytes(StandardCharsets.UTF_8));
+        countries.set(8, "Yemen".getBytes(StandardCharsets.UTF_8));
+        countries.set(9, "Zambia".getBytes(StandardCharsets.UTF_8));
+        countries.setValueCount(10);
+
+        Dictionary myCountryDictionary = new Dictionary(countries,
+                new DictionaryEncoding(/*id=*/123L, /*ordered=*/false, 
/*indexType=*/null));
+        System.out.println("Dictionary used: " + myCountryDictionary);
+
+        myAppUseCountryDictionary.allocateNew(5);
+        myAppUseCountryDictionary.set(0, 
"Andorra".getBytes(StandardCharsets.UTF_8));
+        myAppUseCountryDictionary.set(1, 
"Guinea".getBytes(StandardCharsets.UTF_8));
+        myAppUseCountryDictionary.set(2, 
"Islandia".getBytes(StandardCharsets.UTF_8));
+        myAppUseCountryDictionary.set(3, 
"Malta".getBytes(StandardCharsets.UTF_8));
+        myAppUseCountryDictionary.set(4, 
"Uganda".getBytes(StandardCharsets.UTF_8));
+        myAppUseCountryDictionary.setValueCount(5);
+        System.out.println("Data to retain: " + myAppUseCountryDictionary);
+
+        File file = new File("randon_access_to_file_with_dictionary.arrow");
+        DictionaryProvider.MapDictionaryProvider provider = new 
DictionaryProvider.MapDictionaryProvider();
+        provider.put(myCountryDictionary);
+        try (FieldVector myAppUseCountryDictionaryEncoded = (FieldVector) 
DictionaryEncoder
+                .encode(myAppUseCountryDictionary, myCountryDictionary);
+             VectorSchemaRoot vectorSchemaRoot = 
VectorSchemaRoot.of(myAppUseCountryDictionaryEncoded);
+             FileOutputStream fileOutputStream = new FileOutputStream(file);
+             ArrowFileWriter writer = new ArrowFileWriter(vectorSchemaRoot, 
provider, fileOutputStream.getChannel())
+        ) {
+            System.out.println("Data to retain through Dictionary: " 
+myAppUseCountryDictionaryEncoded);
+            writer.start();
+            writer.writeBatch();
+            writer.end();
+            System.out.println("Record batches written: " + 
writer.getRecordBlocks().size() + ". Number of rows written: " + 
vectorSchemaRoot.getRowCount());
+            try(
+                    BufferAllocator rootAllocator = new RootAllocator();
+                    FileInputStream fileInputStream = new 
FileInputStream(file);
+                    ArrowFileReader reader = new 
ArrowFileReader(fileInputStream.getChannel(), rootAllocator)
+            ){
+                for (ArrowBlock arrowBlock : reader.getRecordBlocks()) {
+                    reader.loadRecordBatch(arrowBlock);
+                    FieldVector myAppUseCountryDictionaryEncodedRead = 
reader.getVectorSchemaRoot().getVector("app-use-country-dict");
+                    Dictionary myAppUseCountryDictionaryRead = 
reader.getDictionaryVectors().get(123L);
+                    System.out.println("Data to retain recovered: " + 
myAppUseCountryDictionaryEncodedRead);
+                    System.out.println("Dictionary recovered: " + 
myAppUseCountryDictionaryRead);
+                    try (ValueVector readVector = 
DictionaryEncoder.decode(myAppUseCountryDictionaryEncodedRead, 
myAppUseCountryDictionaryRead)) {
+                        System.out.println("Data to retain recovered decoded: 
" + readVector);
+                    }
+                }
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+.. testoutput::
+
+    Dictionary used: Dictionary 
DictionaryEncoding[id=123,ordered=false,indexType=Int(32, true)] [Andorra, 
Cuba, Grecia, Guinea, Islandia, Malta, Tailandia, Uganda, Yemen, Zambia]
+    Data to retain: [Andorra, Guinea, Islandia, Malta, Uganda]

Review Comment:
   Changed



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to