使用猪将小数导入卡桑德拉
Import decimal to cassandra using pig
我在这个问题上已经用头撞墙了一段时间,它看起来很简单。我知道我在这里遗漏了一些关键的东西。
使用 Pig 0.12.1.2.1.2.0-402、Cassandra 2.0.9,我正在尝试将精度数字(需要保持相同的精度)导入 Cassandra。
数据本身是使用 Sqoop 从 Oracle 导出的,数字看起来不错。
例如:查询到的数据是38.62782。如果我使用 pig double 或 float 导入,精度会丢失,在这种情况下不是 acceptable。我尝试了多种组合,pig 的 bigdecimal 似乎非常适合,但我无法让它工作,因为我不断得到以下信息:
ERROR org.apache.pig.tools.pigstats.SimplePigStats - ERROR: java.math.BigDecimal cannot be cast to org.apache.pig.data.DataByteArray
所以我不明白我需要做什么才能完成这项工作。我只希望 Oracle(和 Sqoop 文件)中的 38.62782 显示为 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();
和我正在尝试的 table 定义仅供参考:
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'};
事实证明,我的问题与我正在寻找的答案大不相同。
首先,创建 UDF 确实适用于此。但有两件事是,我们使用的是自定义 Cql 存储例程,它没有考虑 BigDecimal。其次,由于另一个原因进一步探索后发现问题出在 cqlsh 上。字段 实际上并没有失去精度 。
但是,我的 总体问题的答案正是此处列出的内容:
Astyanax Cassandra Double type precision
我在这个问题上已经用头撞墙了一段时间,它看起来很简单。我知道我在这里遗漏了一些关键的东西。
使用 Pig 0.12.1.2.1.2.0-402、Cassandra 2.0.9,我正在尝试将精度数字(需要保持相同的精度)导入 Cassandra。
数据本身是使用 Sqoop 从 Oracle 导出的,数字看起来不错。
例如:查询到的数据是38.62782。如果我使用 pig double 或 float 导入,精度会丢失,在这种情况下不是 acceptable。我尝试了多种组合,pig 的 bigdecimal 似乎非常适合,但我无法让它工作,因为我不断得到以下信息:
ERROR org.apache.pig.tools.pigstats.SimplePigStats - ERROR: java.math.BigDecimal cannot be cast to org.apache.pig.data.DataByteArray
所以我不明白我需要做什么才能完成这项工作。我只希望 Oracle(和 Sqoop 文件)中的 38.62782 显示为 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();
和我正在尝试的 table 定义仅供参考:
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'};
事实证明,我的问题与我正在寻找的答案大不相同。
首先,创建 UDF 确实适用于此。但有两件事是,我们使用的是自定义 Cql 存储例程,它没有考虑 BigDecimal。其次,由于另一个原因进一步探索后发现问题出在 cqlsh 上。字段 实际上并没有失去精度 。
但是,我的 总体问题的答案正是此处列出的内容: Astyanax Cassandra Double type precision