Hi

If this is not the right place to ask this question, please let me know. I 
asked on the user group, but am not sure whether it was appropriate there.

I’m trying to access a Phoenix table from Datameer. Datameer can read HBase, 
but doesn’t support using the Phoenix JDBC driver, as the Phoenix JDBC driver 
only does a partial implementation of the JDBC standard.

To get around this I’m using the Datameer SDK to write a function that will 
decode columns of type double. Unfortunately the decoding isn’t going well. Let 
me give you a little test case. All of the following is done with Phoenix 4.4 
on HDP 2.3.4

Here’s the table DDL:-

create table MCALLISTERM.TEST
( FIRSTNAME VARCHAR NOT NULL
, LASTNAME VARCHAR NOT NULL
, CITY VARCHAR NULL
, RATE DOUBLE NULL
, CONSTRAINT TEST_PK PRIMARY KEY (FIRSTNAME, LASTNAME)
);

Here’s a row of test data:-

UPSERT INTO MCALLISTERM.TEST( FIRSTNAME, LASTNAME, CITY, RATE )
VALUES ('Richard', 'Jones', 'San Diego', 137.47 );

When you view this table in Datameer via the HBase driver, it shows up as 
follows:-

[cid:image001.png@01D22954.3E0A9BC0]

The rowkey is fairly easing separated by tokenizing via the null byte 
character. The rate column shows up as it does due to the encoding Phoenix has 
done.

Here is the guts of the conversion function I’m writing …

package com.datameer.sdk;

import datameer.dap.sdk.function.BaseSimpleFunctionType;
import datameer.dap.sdk.function.FieldType;
import datameer.dap.sdk.function.FunctionGroup;
import datameer.dap.sdk.function.argument.ArgumentType;
import datameer.dap.sdk.schema.ValueTypeId;
import org.apache.phoenix.schema.types.PDouble;
import org.apache.phoenix.schema.SortOrder;



public class ApachePhoenixDoubleDecode extends BaseSimpleFunctionType {

    public ApachePhoenixDoubleDecode()
    {
        super( FunctionGroup.ENCODING
            , "ApachePhoenixDoubleDecode"
            , "Converts Apache Phoenix double encoded bytestream into float"
            , new ArgumentType[]{ new ArgumentType("Input", ValueTypeId.STRING) 
}
        );
    }

    @Override
    protected Object compute(Object... arg0) {
        byte[] bytes = ((String)arg0[0]).getBytes();
        int offset = 0;

        return PDouble.INSTANCE.getCodec().decodeDouble(bytes, offset, 
SortOrder.ASC );
    }

    @Override
    public FieldType computeReturnType(FieldType... arg0) {
        return FieldType.FLOAT;
    }

}

They line of code I’m looking for help on is where I’m using PDouble to convert 
the input value to a double value. As you probably suspect, I’m having to guess 
at the offset and the sortorder.

Here’s what shows up when I use this function in datameer on the single row in 
the table, which should be returning 137.47:-

[cid:image002.png@01D22954.3E0A9BC0]

Any pointers on where I’ve gone wrong, and how to correct my plugin?

Regards

Mike

Reply via email to