【问题标题】:Mapping UUID in Spark Cassandra connector在 Spark Cassandra 连接器中映射 UUID
【发布时间】:2019-05-13 19:12:00
【问题描述】:

我有以下代码将 RDD 保存到 cassandra:

 JavaRDD<UserByID> mapped = ......

CassandraJavaUtil.javaFunctions(mapped)
.writerBuilder("mykeyspace", "user_by_id", mapToRow(UserByID.class)).saveToCassandra();

UserByID 是一个普通的可序列化 POJO,具有以下带有 getter 和 setter 的变量

private UUID userid;

Cassandra 表与类 UserByID 变量的名称完全相同,并且 userid 是 Cassandra 表中的 uuid 类型,我正在使用相同的类映射从表中成功加载数据。

CassandraJavaRDD<UserByID> UserByIDRDD = javaFunctions(spark)
 .cassandraTable("mykeyspace", "user_by_id", mapRowTo(UserByID.class));

但是,当我调用上面的saveToCassandra 函数时,我得到以下异常:

org.apache.spark.SparkException: Job aborted due to stage failure: Task
0 in stage 227.0 failed 1 times, most recent failure: Lost task 0.0
in stage 227.0 (TID 12721, localhost, executor driver): 
java.lang.IllegalArgumentException: 
The value (4e22e71a-a387-4de8-baf1-0ef6e65fe33e) of the type 
(java.util.UUID) cannot be converted to 
struct<leastSignificantBits:bigint,mostSignificantBits:bigint> 

为了解决我注册了 UUID 编解码器的问题,但没有帮助,我正在使用 spark-cassandra-connector_2.11 版本 2.4.0 和相同版本的 spark-core_2.11 有什么建议吗?

我的参考是 here,但它没有 Java UUID 示例,感谢您的帮助。

【问题讨论】:

    标签: java apache-spark cassandra rdd spark-cassandra-connector


    【解决方案1】:

    这真是一个奇怪的错误 - 这在连接器 2.4.0 和 Spark 2.2.1 上运行良好,示例如下:

    表定义:

    CREATE TABLE test.utest (
        id int PRIMARY KEY,
        u uuid
    );
    

    POJO class:

    public class UUIDData {
        private UUID u;
        private int id;
        ...
        // getters/setters
    };
    

    Spark job:

    public static void main(String[] args) {
        SparkSession spark = SparkSession
                .builder()
                .appName("UUIDTest")
                .getOrCreate();
    
        CassandraJavaRDD<UUIDData> uuids = javaFunctions(spark.sparkContext())
                .cassandraTable("test", "utest", mapRowTo(UUIDData.class));
    
        JavaRDD<UUIDData> uuids2 = uuids.map(x -> new UUIDData(x.getId() + 10, x.getU()));
    
        CassandraJavaUtil.javaFunctions(uuids2)
                .writerBuilder("test", "utest", mapToRow(UUIDData.class))
                .saveToCassandra();
    }
    

    我注意到,在您的代码中,您使用函数 mapRowTomapToRow 而没有在 POJO 上调用 .class - 您确定您的代码已编译并且您没有运行任何旧版本的代码?

    【讨论】:

    • 感谢您的回答,我已经有了 .class 但忘记在问题中添加它们,因为我更改了我实际拥有的类名。反正我会试一试的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2015-10-08
    • 2015-03-12
    • 2018-11-28
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多