2015-02-26 3 views
1

Я уже несколько секунд стуча головой о стену, и это кажется таким простым. Я знаю, что у меня что-то отсутствует.Импорт десятичного числа в cassandra с помощью свиньи

Использование Pig 0.12.1.2.1.2.0-402, Cassandra 2.0.9, я пытаюсь импортировать точное число (которое должно оставаться с той же точностью) в Cassandra.

Данные сами экспортируются из Oracle с использованием Sqoop, и цифры выглядят отлично.

Например: Данные, указанные в данном документе, являются 38.62782. Если я импортирую с помощью двойного или поплавкового свина, точность теряется, что неприемлемо в этом случае. Я попробовал несколько комбинаций и BigDecimal свиньи, кажется, идеально подходит, но я не могу заставить его работать, как я постоянно получаю следующее:

ERROR org.apache.pig.tools.pigstats.SimplePigStats - ERROR: java.math.BigDecimal cannot be cast to org.apache.pig.data.DataByteArray 

Так что я не понимаю, что мне нужно сделать, чтобы эта работа. Я просто хочу, чтобы 38.62782 из Oracle (и файла Sqoop) отображался как 38.62782, не делая столбец Cassandra текстовым полем.

Образца свинья:

DEFINE UnixToISO org.apache.pig.piggybank.evaluation.datetime.convert.UnixToISO(); 
DEFINE ISOToUnix org.apache.pig.piggybank.evaluation.datetime.convert.ISOToUnix(); 
DEFINE CustomToDate2Args com.mine.pig.udf.CustomToDate2Args(); 
DEFINE ToBoolean com.mine.pig.udf.ToBoolean(); 
DEFINE CustomCqlStorage com.mine.pig.CustomCqlStorage(); 
DEFINE s2d InvokeForDouble('java.lang.Double.parseDouble', 'String'); 

oracle_load = LOAD '$input_file' USING PigStorage('  ') AS (
    NAME:chararray, 
    MYDOUBLE:chararray, 
    MYFLOAT:float, 
    MYDECIMAL:bytearray, 
    MYTEXT:chararray); 

oracle_data = FOREACH oracle_load generate 
    (NAME=='null'?null:NAME) as NAME, 
    MYDOUBLE, 
    MYFLOAT, 
    MYDECIMAL, 
    MYTEXT; 


R = FOREACH oracle_data GENERATE TOTUPLE(TOTUPLE('name',NAME)), TOTUPLE(
    s2d(MYDOUBLE), 
    MYFLOAT, 
    MYDECIMAL, 
    MYTEXT); 


STORE R into 'cql://$cass_user:[email protected]$cass_keyspace/mydoubletest?output_query=update+$cass_keyspace.mydoubletest+set+mydouble+%3D+%3F,myfloat+%3D+%3F,mydecimal+%3D+%3F,mytext+%3D+%3F' USING CustomCqlStorage(); 

и определение таблицы я пробуя только для справки:

CREATE TABLE mydoubletest (
    name text, 
    mydecimal decimal, 
    mydouble double, 
    myfloat float, 
    mytext text, 
    PRIMARY KEY ((name)) 
) WITH 
    bloom_filter_fp_chance=0.010000 AND 
    caching='KEYS_ONLY' AND 
    dclocal_read_repair_chance=0.000000 AND 
    gc_grace_seconds=864000 AND 
    index_interval=128 AND 
    read_repair_chance=0.100000 AND 
    replicate_on_write='true' AND 
    populate_io_cache_on_flush='false' AND 
    default_time_to_live=0 AND 
    speculative_retry='99.0PERCENTILE' AND 
    memtable_flush_period_in_ms=0 AND 
    compaction={'class': 'SizeTieredCompactionStrategy'} AND 
    compression={'sstable_compression': 'LZ4Compressor'}; 
+0

Вот документ о типах данных Cassandra CQL, и что они отображают в. Посмотрите, можете ли вы найти совпадение здесь: http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/cql_data_types_c.html – Aaron

+0

Да, это говорит о том, что десятичное число в Кассандре соответствует java.math.BigDecimal, что делает его еще более неприятным, что я не могу просто использовать «MYDECIMAL: bigdecimal» выше (когда я делаю это, я получаю исключение). Там также нет опции InvokeToBigDecimal, поэтому я не уверен, что мне нужно что-то делать с UDF, но похоже, что такой крутой способ сделать что-то настолько простое. – user4611739

ответ

0

Оказывается, моя проблема была совсем другой, чем ответ, который я искал.

Прежде всего, создание UDF действительно сработало для этого. Однако две вещи состоят в том, что мы использовали обычную процедуру хранения Cql, которая не учитывала BigDecimal. Во-вторых, после дальнейших исследований из-за отдельной причины выясняется, что проблема была связана с cqlsh. Поля на самом деле не теряли точность.

Однако, ответ на мой общей проблемой было то, что было перечислено здесь: Astyanax Cassandra Double type precision

Смежные вопросы