美文网首页
【spark】join (java)

【spark】join (java)

作者: 加菲饿 | 来源:发表于2019-08-01 19:04 被阅读0次

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"));//正确

相关文章

网友评论

      本文标题:【spark】join (java)

      本文链接:https://www.haomeiwen.com/subject/wlncdctx.html