[ 
https://issues.apache.org/jira/browse/TAJO-1686?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15182502#comment-15182502
 ] 

ASF GitHub Bot commented on TAJO-1686:
--------------------------------------

Github user jihoonson commented on a diff in the pull request:

    https://github.com/apache/tajo/pull/929#discussion_r55157850
  
    --- Diff: 
tajo-common/src/main/java/org/apache/tajo/util/WritableTypeConverter.java ---
    @@ -0,0 +1,127 @@
    +/**
    + * 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.tajo.util;
    +
    +import org.apache.hadoop.hive.serde2.io.DateWritable;
    +import org.apache.hadoop.hive.serde2.io.TimestampWritable;
    +import org.apache.hadoop.io.*;
    +import org.apache.tajo.common.TajoDataTypes.Type;
    +import org.apache.tajo.common.TajoDataTypes.DataType;
    +import org.apache.tajo.datum.*;
    +import org.apache.tajo.exception.NotImplementedException;
    +import org.apache.tajo.exception.TajoRuntimeException;
    +import org.apache.tajo.util.datetime.DateTimeConstants;
    +import org.apache.tajo.util.datetime.DateTimeUtil;
    +import org.reflections.ReflectionUtils;
    +
    +import java.sql.Timestamp;
    +import java.util.Set;
    +
    +public class WritableTypeConverter {
    +
    +  public static DataType convertWritableToTajoType(Class<? extends 
Writable> writableClass) {
    +    if (writableClass == null)
    +      return null;
    +
    +    DataType.Builder builder = DataType.newBuilder();
    +    Set<Class<?>> parents = 
ReflectionUtils.getAllSuperTypes(writableClass);
    +
    +    if (writableClass == ByteWritable.class || 
parents.contains(ByteWritable.class)) {
    +      return builder.setType(Type.INT1).build();
    +    }
    +    if (writableClass == ShortWritable.class || 
parents.contains(ShortWritable.class)) {
    +      return builder.setType(Type.INT2).build();
    +    }
    +    if (writableClass == IntWritable.class || 
parents.contains(IntWritable.class)) {
    +      return builder.setType(Type.INT4).build();
    +    }
    +    if (writableClass == LongWritable.class || 
parents.contains(LongWritable.class)) {
    +      return builder.setType(Type.INT8).build();
    +    }
    +    if (writableClass == Text.class || parents.contains(Text.class)) {
    +      return builder.setType(Type.TEXT).build();
    +    }
    +    if (writableClass == FloatWritable.class || 
parents.contains(FloatWritable.class)) {
    +      return builder.setType(Type.FLOAT4).build();
    +    }
    +    if (writableClass == DoubleWritable.class || 
parents.contains(DoubleWritable.class)) {
    +      return builder.setType(Type.FLOAT8).build();
    +    }
    +    if (writableClass == DateWritable.class || 
parents.contains(DateWritable.class)) {
    +      return builder.setType(Type.DATE).build();
    +    }
    +    if (writableClass == TimestampWritable.class || 
parents.contains(TimestampWritable.class)) {
    +      return builder.setType(Type.TIMESTAMP).build();
    +    }
    +    if (writableClass == BytesWritable.class || 
parents.contains(BytesWritable.class)) {
    +      return builder.setType(Type.VARBINARY).build();
    +    }
    +
    +    throw new TajoRuntimeException(new 
NotImplementedException(writableClass.getSimpleName()));
    +  }
    +
    +  public static Writable convertDatum2Writable(Datum value) {
    +    switch(value.type()) {
    +      case INT1: return new ByteWritable(value.asByte());
    +      case INT2: return new ShortWritable(value.asInt2());
    +      case INT4: return new IntWritable(value.asInt4());
    +      case INT8: return new LongWritable(value.asInt8());
    +
    +      case FLOAT4: return new FloatWritable(value.asFloat4());
    +      case FLOAT8: return new DoubleWritable(value.asFloat8());
    +
    +      // NOTE: value should be DateDatum
    +      case DATE: return new DateWritable(value.asInt4() - 
DateTimeConstants.UNIX_EPOCH_JDATE);
    +
    +      // NOTE: value should be TimestampDatum
    +      case TIMESTAMP:
    +        TimestampWritable result = new TimestampWritable();
    +        result.setTime(DateTimeUtil.julianTimeToJavaTime(value.asInt8()));
    +        return result;
    +
    +      case TEXT: return new Text(value.asChars());
    +      case VARBINARY: return new BytesWritable(value.asByteArray());
    +    }
    +
    +    throw new TajoRuntimeException(new 
NotImplementedException(value.type().name()));
    +  }
    +
    +  public static Datum convertWritable2Datum(Writable value) {
    +    DataType type = convertWritableToTajoType(value.getClass());
    +
    +    switch(type.getType()) {
    +      case INT1: return new Int2Datum(((ByteWritable)value).get());
    +      case INT2: return new Int2Datum(((ShortWritable)value).get());
    +      case INT4: return new Int4Datum(((IntWritable)value).get());
    +      case INT8: return new Int8Datum(((LongWritable)value).get());
    +
    +      case FLOAT4: return new Float4Datum(((FloatWritable)value).get());
    +      case FLOAT8: return new Float8Datum(((DoubleWritable)value).get());
    +
    +      case DATE: return new DateDatum(((DateWritable)value).getDays() + 
DateTimeConstants.UNIX_EPOCH_JDATE);
    +      case TIMESTAMP: return new 
TimestampDatum(DateTimeUtil.javaTimeToJulianTime(
    +          ((TimestampWritable)value).getTimestamp().getTime()));
    +
    +      case TEXT: return new TextDatum(value.toString());
    +      case VARBINARY: return new 
BlobDatum(((BytesWritable)value).getBytes());
    +    }
    +
    +    return NullDatum.get();
    --- End diff --
    
    I think throwing UnsupportedDataTypeException looks more proper.


> Allow Tajo to use Hive UDF
> --------------------------
>
>                 Key: TAJO-1686
>                 URL: https://issues.apache.org/jira/browse/TAJO-1686
>             Project: Tajo
>          Issue Type: New Feature
>          Components: Function/UDF
>            Reporter: Jaehwa Jung
>            Assignee: Jongyoung Park
>
> Hive has been widely used in this area. Many users have maintained lots of 
> big tables through Hive metastore using HiveQL and UDFs. Currently, Tajo 
> provides own UDF and Hive users can implement their UDFs in Tajo. But if we 
> can wrap Hive UDF in Tajo, it seems that they would be able to use Tajo 
> easily for their analysis infrastructure.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to