Project: Apache Heron (App Definition and Development / Streaming & Messaging)
File: guides-data-model.md

id: version-0.20.0-incubating-guides-data-model title: Heron Data Model sidebar_label: Heron Data Model original_id: guides-data-model <!-- 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. --> Tuple is Heron's core data type. All data that is fed into a Heron topology via and then processed by consists of tuples. Heron has a interface for working with tuples. Heron `Tuple`s can hold values of any type; values are accessible either by providing an index or a field name. Heron's `Tuple` interface contains the methods listed in the [Javadoc definition](/api/org/apache/heron/api/tuple/Tuple.html). Heron `Tuple`s support a wide variety of primitive Java types, including strings, Booleans, byte arrays, and more. method, for example, takes an integer index and returns either a string or `null` if no string value is present at that index. Analogous methods can be found in the Javadoc. In addition to being accessible via index, values stored in Heron tuples are accessible via field name as well. The method, for example, takes a field name string and returns either a string or `null` if no string value is present for that field name. Analogous methods can be found in the

In addition to primitive types, you can access any value in a Heron `Tuple` as a Java `Object`. As for primitive types, you can access `Object`s on the basis of an index or a field name. The following methods return either an `Object` or `null` if no object is present: You can also retrieve all objects contained in a Heron `Tuple` as a Java using the method. You use Heron tuples in conjunction with more complex, user-defined types using , provided that you've created and registered a for the type. Here's an example (which assumes that a serializer for the type `Tweet` has been created and registered): ```java public void execute(Tuple input) { // The following return null if no value is present or throws a // ClassCastException if type casting fails: Tweet tweet = (Tweet) input.getValue(0); List<Tweet> allTweets = input.getValues(); } ``` More info on custom serialization can be found in [Creating Custom Tuple Serializers](guides-tuple-serialization). The `getFields` method returns a object that contains all of the fields in the tuple. More on fields can be found . There are additional methods available for determining the size of Heron `Tuple`s, extracting contextual information, and more. For a full listing of methods, see the . From the methods in the list above you can see that you can retrieve single values from a Heron tuple on the basis of their index. You can also retrieve multiple values using a object, which can be initialized either using varargs or a list of strings: ```java // Using varargs Fields fruits = new Fields("apple", "orange", "banana"); // Using a list of strings List<String> fruitNames = new LinkedList<String>(); fruitNames.add("apple"); // Add "orange" and "banana" as well Fields fruits = new Fields(fruitNames); ``` You can then use that object in conjunction with a tuple: ```java public void execute(Tuple input) { List<Object> values = input.select(fruits); for (Object value : values) { System.out.println(value); } } ```