Java Spark RDDs与列表的连接操作

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

我有以下RDD:

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。生活要容易得多