/*
* 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.cassandra.pig;
/*
*
* 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.
*
*/
import java.io.IOException;
import java.nio.charset.CharacterCodingException;
import java.util.Iterator;
import org.apache.cassandra.db.marshal.TimeUUIDType;
import org.apache.cassandra.db.marshal.UUIDType;
import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.thrift.AuthenticationException;
import org.apache.cassandra.thrift.AuthorizationException;
import org.apache.cassandra.thrift.InvalidRequestException;
import org.apache.cassandra.thrift.NotFoundException;
import org.apache.cassandra.thrift.TimedOutException;
import org.apache.cassandra.thrift.UnavailableException;
import org.apache.cassandra.utils.Hex;
import org.apache.pig.data.DataBag;
import org.apache.pig.data.DataByteArray;
import org.apache.pig.data.Tuple;
import org.apache.thrift.TException;
import org.apache.thrift.transport.TTransportException;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
public class ThriftColumnFamilyDataTypeTest extends PigTestBase
{
//AsciiType
//LongType
//BytesType
//BooleanType
//CounterColumnType
//DecimalType
//DoubleType
//FloatType
//InetAddressType
//Int32Type
//UTF8Type
//DateType
//UUIDType
//IntegerType
//TimeUUIDType
//IntegerType
//LexicalUUIDType
private static String[] statements = {
"create keyspace thriftKs with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' and" +
" strategy_options={replication_factor:1};",
"use thriftKs;",
"create column family SomeApp " +
" with comparator = UTF8Type " +
" and default_validation_class = UTF8Type " +
" and key_validation_class = UTF8Type " +
" and column_metadata = [" +
"{column_name: col_ascii, validation_class: AsciiType}, " +
"{column_name: col_long, validation_class: LongType}, " +
"{column_name: col_bytes, validation_class: BytesType}, " +
"{column_name: col_boolean, validation_class: BooleanType}, " +
"{column_name: col_decimal, validation_class: DecimalType}, " +
"{column_name: col_double, validation_class: DoubleType}, " +
"{column_name: col_float, validation_class: FloatType}," +
"{column_name: col_inetaddress, validation_class: InetAddressType}, " +
"{column_name: col_int32, validation_class: Int32Type}, " +
"{column_name: col_uft8, validation_class: UTF8Type}, " +
"{column_name: col_date, validation_class: DateType}, " +
"{column_name: col_uuid, validation_class: UUIDType}, " +
"{column_name: col_integer, validation_class: IntegerType}, " +
"{column_name: col_timeuuid, validation_class: TimeUUIDType}, " +
"{column_name: col_lexical_uuid, validation_class: LexicalUUIDType}, " +
"]; ",
"set SomeApp['foo']['col_ascii'] = 'ascii';",
"set SomeApp['foo']['col_boolean'] = false;",
"set SomeApp['foo']['col_bytes'] = 'DEADBEEF';",
"set SomeApp['foo']['col_date'] = '2011-02-03T04:05:00+0000';",
"set SomeApp['foo']['col_decimal'] = '23.345';",
"set SomeApp['foo']['col_double'] = '2.7182818284590451';",
"set SomeApp['foo']['col_float'] = '23.45';",
"set SomeApp['foo']['col_inetaddress'] = '127.0.0.1';",
"set SomeApp['foo']['col_int32'] = 23;",
"set SomeApp['foo']['col_integer'] = 12345;",
"set SomeApp['foo']['col_long'] = 12345678;",
"set SomeApp['foo']['col_lexical_uuid'] = 'e23f450f-53a6-11e2-7f7f-7f7f7f7f7f77';",
"set SomeApp['foo']['col_timeuuid'] = 'e23f450f-53a6-11e2-7f7f-7f7f7f7f7f7f';",
"set SomeApp['foo']['col_uft8'] = 'hello';",
"set SomeApp['foo']['col_uuid'] = '550e8400-e29b-41d4-a716-446655440000';",
"create column family CC with " +
"key_validation_class = UTF8Type and " +
"default_validation_class=CounterColumnType " +
"and comparator=UTF8Type;",
"incr CC['chuck']['kick'];",
"incr CC['chuck']['kick'];",
"incr CC['chuck']['kick'];"
};
@BeforeClass
public static void setup() throws TTransportException, IOException, InterruptedException, ConfigurationException,
AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, CharacterCodingException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException
{
startCassandra();
setupDataByCli(statements);
startHadoopCluster();
}
@Test
public void testCassandraStorageDataType() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException
{
pig.registerQuery("rows = LOAD 'cassandra://thriftKs/SomeApp?" + defaultParameters + "' USING CassandraStorage();");
//{key: chararray, col_ascii: (name: chararray,value: chararray),
//col_boolean: (name: chararray,value: bytearray),
//col_bytes: (name: chararray,value: bytearray),
//col_date: (name: chararray,value: long),
//col_decimal: (name: chararray,value: chararray),
//col_double: (name: chararray,value: double),
//col_float: (name: chararray,value: float),
//col_inetaddress: (name: chararray,value: chararray),
//col_int32: (name: chararray,value: int),
//col_integer: (name: chararray,value: int),
//col_lexical_uuid: (name: chararray,value: chararray),
//col_long: (name: chararray,value: long),
//col_timeuuid: (name: chararray,value: bytearray),
//col_uft8: (name: chararray,value: chararray),
//col_uuid: (name: chararray,value: chararray),
//columns: {(name: chararray,value: chararray)}}
Iterator<Tuple> it = pig.openIterator("rows");
if (it.hasNext()) {
Tuple t = it.next();
Assert.assertEquals(t.get(0), "foo");
Tuple column = (Tuple) t.get(1);
Assert.assertEquals(column.get(1), "ascii");
column = (Tuple) t.get(2);
Assert.assertEquals(column.get(1), false);
column = (Tuple) t.get(3);
Assert.assertEquals(column.get(1), new DataByteArray(Hex.hexToBytes("DEADBEEF")));
column = (Tuple) t.get(4);
Assert.assertEquals(column.get(1), 1296705900000L);
column = (Tuple) t.get(5);
Assert.assertEquals(column.get(1), "23.345");
column = (Tuple) t.get(6);
Assert.assertEquals(column.get(1), 2.7182818284590451d);
column = (Tuple) t.get(7);
Assert.assertEquals(column.get(1), 23.45f);
column = (Tuple) t.get(8);
Assert.assertEquals(column.get(1), "127.0.0.1");
column = (Tuple) t.get(9);
Assert.assertEquals(column.get(1), 23);
column = (Tuple) t.get(10);
Assert.assertEquals(column.get(1), 12345);
column = (Tuple) t.get(11);
Assert.assertEquals(column.get(1), new DataByteArray((TimeUUIDType.instance.fromString("e23f450f-53a6-11e2-7f7f-7f7f7f7f7f77").array())));
column = (Tuple) t.get(12);
Assert.assertEquals(column.get(1), 12345678L);
column = (Tuple) t.get(13);
Assert.assertEquals(column.get(1), new DataByteArray((TimeUUIDType.instance.fromString("e23f450f-53a6-11e2-7f7f-7f7f7f7f7f7f").array())));
column = (Tuple) t.get(14);
Assert.assertEquals(column.get(1), "hello");
column = (Tuple) t.get(15);
Assert.assertEquals(column.get(1), new DataByteArray((UUIDType.instance.fromString("550e8400-e29b-41d4-a716-446655440000").array())));
}
pig.registerQuery("cc_rows = LOAD 'cassandra://thriftKs/CC?" + defaultParameters + "' USING CassandraStorage();");
//(chuck,{(kick,3)})
it = pig.openIterator("cc_rows");
if (it.hasNext()) {
Tuple t = it.next();
Assert.assertEquals(t.get(0), "chuck");
DataBag columns = (DataBag) t.get(1);
Iterator<Tuple> iter = columns.iterator();
if(iter.hasNext())
{
Tuple column = iter.next();
Assert.assertEquals(column.get(0), "kick");
Assert.assertEquals(column.get(1), 3L);
}
}
}
}