使用pig将十进制数导入cassandra

c9qzyr3d  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(318)

我已经把头撞在墙上有一段时间了,看起来很简单。我知道我丢了钥匙。
使用pig 0.12.1.2.1.2.0-402,cassandra 2.0.9,我试图将一个精度数字(需要保持相同的精度)导入cassandra。
数据本身是使用sqoop从oracle导出的,数字看起来不错。
例如:所讨论的数据是38.62782。如果使用清管器双精度或浮点数导入,则会丢失精度,这在本例中是不可接受的。我尝试了多种组合,pig的bigdecimal似乎是一个完美的匹配,但我无法让它工作,因为我不断得到以下结果:

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

所以我不明白我该怎么做才能让这一切顺利。我只希望oracle的38.62782(以及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:$cass_pass@$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'};
w3nuxt5m

w3nuxt5m1#

结果发现我的问题和我想要的答案大不相同。
首先,创建一个自定义项确实可以做到这一点。不过,有两件事是,我们使用了一个定制的cql存储例程,它没有考虑bigdecimal。其次,由于另一个原因,经过进一步的探索,发现问题出在cqlsh身上。这些字段实际上并没有失去精度。
然而,我的整个问题的答案正是这里列出的:astyanax cassandra双精度

相关问题