Я уже несколько секунд стуча головой о стену, и это кажется таким простым. Я знаю, что у меня что-то отсутствует.Импорт десятичного числа в 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'};
Вот документ о типах данных Cassandra CQL, и что они отображают в. Посмотрите, можете ли вы найти совпадение здесь: http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/cql_data_types_c.html – Aaron
Да, это говорит о том, что десятичное число в Кассандре соответствует java.math.BigDecimal, что делает его еще более неприятным, что я не могу просто использовать «MYDECIMAL: bigdecimal» выше (когда я делаю это, я получаю исключение). Там также нет опции InvokeToBigDecimal, поэтому я не уверен, что мне нужно что-то делать с UDF, но похоже, что такой крутой способ сделать что-то настолько простое. – user4611739