Spark GraphX Java绑定中fromEdges方法的evidence参数处理
处理Spark GraphX Java版fromEdges()中的未文档化evidence参数问题
Spark GraphX的Java版fromEdges()方法里出现的evidence$16、evidence$17这类参数,是Scala泛型编译机制的产物——Scala会通过ClassTag在运行时保留泛型类型信息,而Java没有原生支持,所以这些参数在Java文档里未被明确说明。
解决步骤
- 构造ClassTag实例:Java中可以通过
ClassTag$.MODULE$.apply(Class)来生成对应泛型类型的ClassTag,分别传入VD(顶点值类型)和ED(边值类型)的类对象,比如ClassTag$.MODULE$.apply(Long.class)。 - 避免类型不匹配异常:如果调用时出现
java.lang.ArrayStoreException: java.lang.Integer,大概率是默认值的类型和泛型VD/ED不匹配导致的。比如泛型指定为Long,但默认值传了int类型的1,需要改成1L这种对应类型的值。
方法签名参考
public static <VD,ED> Graph<VD,ED> fromEdges(RDD<Edge<ED>> edges, VD defaultValue, StorageLevel edgeStorageLevel, StorageLevel vertexStorageLevel, scala.reflect.ClassTag<VD> evidence$16, scala.reflect.ClassTag<ED> evidence$17)
正确调用示例
// 准备边数据RDD RDD<Edge<Long>> edgesRDD = ...; // 生成对应类型的ClassTag scala.reflect.ClassTag<Long> vertexTag = ClassTag$.MODULE$.apply(Long.class); scala.reflect.ClassTag<Long> edgeTag = ClassTag$.MODULE$.apply(Long.class); // 调用fromEdges方法 Graph<Long, Long> graph = Graph.fromEdges( edgesRDD, 0L, // 顶点默认值,与泛型VD类型一致 StorageLevel.MEMORY_ONLY(), StorageLevel.MEMORY_ONLY(), vertexTag, edgeTag );
内容的提问来源于stack exchange,提问作者Wheezil
相关产品推荐
相关产品推荐

