RCFile¶
RCFile, short of Record Columnar File, are flat files consisting of binary key/value pairs, which shares many similarities with SequenceFile.
How to Create a RCFile Table?¶
If you are not familiar with the CREATE TABLE
statement, please refer to the Data Definition Language Data Definition Language.
In order to specify a certain file format for your table, you need to use the USING
clause in your CREATE TABLE
statement. Below is an example statement for creating a table using RCFile.
CREATE TABLE table1 (
id int,
name text,
score float,
type text
) USING RCFILE;
Physical Properties¶
Some table storage formats provide parameters for enabling or disabling features and adjusting physical parameters.
The WITH
clause in the CREATE TABLE statement allows users to set those parameters.
Now, the RCFile storage type provides the following physical properties.
rcfile.serde
: custom (De)serializer class.org.apache.tajo.storage.BinarySerializerDeserializer
is the default (de)serializer class.rcfile.null
: NULL character. It is only used when a table usesorg.apache.tajo.storage.TextSerializerDeserializer
. The default NULL character is an empty string''
. Hive’s default NULL character is'\\N'
.compression.codec
: Compression codec. You can enable compression feature and set specified compression algorithm. The compression algorithm used to compress files. The compression codec name should be the fully qualified class name inherited from org.apache.hadoop.io.compress.CompressionCodec. By default, compression is disabled.
The following is an example for creating a table using RCFile that uses compression.
CREATE TABLE table1 (
id int,
name text,
score float,
type text
) USING RCFILE WITH ('compression.codec'='org.apache.hadoop.io.compress.SnappyCodec');
RCFile (De)serializers¶
Tajo provides two built-in (De)serializer for RCFile:
org.apache.tajo.storage.TextSerializerDeserializer
: stores column values in a plain-text form.org.apache.tajo.storage.BinarySerializerDeserializer
: stores column values in a binary file format.
The RCFile format can store some metadata in the RCFile header. Tajo writes the (de)serializer class name into the metadata header of each RCFile when the RCFile is created in Tajo.
Note
org.apache.tajo.storage.BinarySerializerDeserializer
is the default (de) serializer for RCFile.
Compatibility Issues with Apache Hive™¶
Regardless of whether the RCFiles are written by Apache Hive™ or Apache Tajo™, the files are compatible in both systems. In other words, Tajo can process RCFiles written by Apache Hive and vice versa.
Since there are no metadata in RCFiles written by Hive, we need to manually specify the (de)serializer class name by setting a physical property.
In Hive, there are two SerDe, and they correspond to the following (de)serializer in Tajo.
org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe
: corresponds toTextSerializerDeserializer
in Tajo.org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe
: corresponds toBinarySerializerDeserializer
in Tajo.
The compatibility issue mostly occurs when a user creates an external table pointing to data of an existing table. The following section explains two cases: 1) the case where Tajo reads RCFile written by Hive, and 2) the case where Hive reads RCFile written by Tajo.
When Tajo reads RCFile generated in Hive¶
To create an external RCFile table generated with ColumnarSerDe
in Hive,
you should set the physical property rcfile.serde
in Tajo as follows:
CREATE EXTERNAL TABLE table1 (
id int,
name text,
score float,
type text
) USING RCFILE with ( 'rcfile.serde'='org.apache.tajo.storage.TextSerializerDeserializer', 'rcfile.null'='\\N' )
LOCATION '....';
To create an external RCFile table generated with LazyBinaryColumnarSerDe
in Hive,
you should set the physical property rcfile.serde
in Tajo as follows:
CREATE EXTERNAL TABLE table1 (
id int,
name text,
score float,
type text
) USING RCFILE WITH ('rcfile.serde' = 'org.apache.tajo.storage.BinarySerializerDeserializer')
LOCATION '....';
Note
As we mentioned above, BinarySerializerDeserializer
is the default (de) serializer for RCFile.
So, you can omit the rcfile.serde
only for org.apache.tajo.storage.BinarySerializerDeserializer
.
When Hive reads RCFile generated in Tajo¶
To create an external RCFile table written by Tajo with TextSerializerDeserializer
,
you should set the SERDE
as follows:
CREATE TABLE table1 (
id int,
name string,
score float,
type string
) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe' STORED AS RCFILE
LOCATION '<hdfs_location>';
To create an external RCFile table written by Tajo with BinarySerializerDeserializer
,
you should set the SERDE
as follows:
CREATE TABLE table1 (
id int,
name string,
score float,
type string
) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe' STORED AS RCFILE
LOCATION '<hdfs_location>';