1. RDD join
rdd可以join的前提是必须是JavaPairRDD, 两个RDD的jion是通过PairRDD中的key来建立联系的
JavaPairRDD支持
内连接 JavaPairRDD.join
左连接 JavaPairRDD.leftOuterJoin
右链接 JavaPairRDD.rightOuterJoin
全连接 JavaPairRDD.fullOuterJoin
JavaPairRDD<Integer, Integer> javaRDD1 = jsc.parallelize(Lists.newArrayList(3,1,2,4,11,6,7,90,9))
.mapToPair(t -> Tuple2.apply(t, 2*t));
JavaPairRDD<Integer, Integer> javaRDD2 = jsc.parallelize(Lists.newArrayList(3,1,2,4,11,6,7,90,9))
.mapToPair(t -> Tuple2.apply(t, t*t));
JavaPairRDD<Integer, Tuple2<Integer, Integer>> innerJoinRdd = javaRDD1.join(javaRDD2);
JavaPairRDD<Integer, Tuple2<Integer, Optional<Integer>>> leftJoinRdd = javaRDD1.leftOuterJoin(javaRDD2);
2. Dataframe/Dataset join
Dataframe/Dataset 可以指定通过某一列来做join(与sql基本一致)
示例
Dataset<Row> joinSet = dataset1.join(dataset2,dataset1.col("id").equalTo(dataset2.col("id")), "left_outer");
如果两个表的列明相同,且是内连接,第二个参数可以直接用String
例如
dataset1.join(dataset2,"id");
这种方式join后只会保留一个id列。
dataset1.col("id").equalTo(dataset2.col("id")) 而这样的方式会有两个id列
如果要去除其中一个id列,可是用.drop(dataset1.col("id"))
注意,两个列的情况下如果select需要明确指明需要的那个id
例如
joinSet.select("id");//会报错“Reference 'id' is ambiguous, could be: id, id.”
joinSet.select(dataset1.col("id"));//正确
网友评论