Java Spark RDDs与列表的连接操作
我有以下RDD:Java Spark RDDs与列表的连接操作,java,apache-spark,java-8,rdd,Java,Apache Spark,Java 8,Rdd,我有以下RDD: JavaPairRDD<List<String>, String> firstRDD = ... firstRDD.foreach(row -> System.out.println(row._1() + ", " + row._2())); // [Man, Parent], Father JavaPairRDD<List<String>, String> secondRDD = ... second
JavaPairRDD<List<String>, String> firstRDD = ...
firstRDD.foreach(row -> System.out.println(row._1() + ", " + row._2()));
// [Man, Parent], Father
JavaPairRDD<List<String>, String> secondRDD = ...
secondRDD.foreach(row -> System.out.println(row._1() + ", " + row._2()));
// [Man, Parent, Father], Person
javapairdd firstRDD=。。。
firstRDD.foreach(row->System.out.println(row._1()+”,“+row._2());
//[男人,父母],父亲
JavaPairRDD secondRDD=。。。
secondRDD.foreach(row->System.out.println(row._1()+”,“+row._2());
//[男人,父母,父亲],人
我想执行一个内部联接,这样,如果左键位于右键的子列表中,那么一行等于另一行(在前一个示例中,[Man,Parent]
位于[Man,Parent,Father]
)
有什么建议吗
谢谢 对于RDD(以及JavaPairDDS),操作只能检查是否存在完全匹配的键
因此,我们必须将RDD转换为数据帧:
公共静态数据集toDataframe(SparkSession spark,JavaPairRDD rdd){
JavaRDD rowRDD1=rdd.map(元组->{
Seq key=JavaConverters.asscalateratorconverter(tuple._1().iterator()).asScala().toSeq();
返回RowFactory.create(key,tuple._2());
});
StructType st=新的StructType()
.add(新结构域(“键”,数据类型.createArrayType(数据类型.StringType),true,新MetadataBuilder().build())
.add(new StructField(“value”,DataTypes.StringType,true,new MetadataBuilder().build());
返回spark.createDataFrame(rowRDD1,st);
}
对于连接条件,我们需要一个UDF来检查一个数组是否是另一个数组的一部分。如果元素的顺序不重要,也可以使用
UserDefinedFunction contains=functions.udf((Seq a,Seq b)->b.containssslice(a),DataTypes.BooleanType);
把这两个元素放在一起,我们得到
Dataset df1=toDataframe(spark,firstRDD);
数据集df2=toDataframe(spark,secondRDD);
Dataset result=df1.join(df2,contains.apply(df1.col(“key”),df2.col(“key”));
使用输入数据
firstRDD secondRDD
+------+-----+ +------------+-----+
|键|值| |键|值|
+------+-----+ +------------+-----+
|[a,b]| a | |[a,b,c]| c|
|[b,a]| b | |[a,b,c,d]| d|
+------+-----+ +------------+-----+
我们得到
+------+-----+------------+-----+
|键|值|键|值|
+------+-----+------------+-----+
|[a,b]| a |[a,b,c]| c|
|[a,b]| a |[a,b,c,d]| d|
+------+-----+------------+-----+
请注意,使用UDF作为联接条件可能不是最佳选择。我的建议是使用scala和dataframes。生活要容易得多