Apache spark 如何在PySpark中将两个rdd合并为一个

Apache spark 如何在PySpark中将两个rdd合并为一个,apache-spark,pyspark,apache-spark-sql,rdd,Apache Spark,Pyspark,Apache Spark Sql,Rdd,我得到了两个RDD,并希望按如下方式合并成一个RDD: rdd_1 = ['a1', 'a2', 'a3', 'a4', 'a5', ] rdd_2 = ['b1', 'b2', 'b3', 'b4', 'b5', ] # concat and combine these two rdd into one rdd = ['a1_b1', 'a2_b2', 'a3_b3', 'a4_b4', 'a5_b5'] 我知道我可以将这两个RDD转换为DataFrame,并在spark.sql中进行压缩

我得到了两个
RDD
,并希望按如下方式合并成一个
RDD

rdd_1 = ['a1', 'a2', 'a3', 'a4', 'a5', ]
rdd_2 = ['b1', 'b2', 'b3', 'b4', 'b5', ]

# concat and combine these two rdd into one
rdd = ['a1_b1', 'a2_b2', 'a3_b3', 'a4_b4', 'a5_b5']
我知道我可以将这两个
RDD
转换为
DataFrame
,并在
spark.sql
中进行压缩,如下所示:

df = df.withColumn('col1_col2', concat(col('col1'), lit(' '), col('col2')))
但对于比隆级样本来说,它的效率还不够。

因此,我想知道在
RRD
编程中是否有更快的方法。

我想看看zip和join:

rdd_1.zip(rdd_2).map(lambda x : '_'.join(x)).collect()
或不带
lambda

rdd_1.zip(rdd_2).map('_'.join).collect()

例如:

rdd_1 = spark.sparkContext.parallelize(['a1', 'a2', 'a3', 'a4', 'a5', ])
rdd_2 = spark.sparkContext.parallelize(['b1', 'b2', 'b3', 'b4', 'b5', ])

rdd_1.zip(rdd_2).map(lambda x : '_'.join(x)).collect()


从列表中创建RDD,然后在两个RDD上进行压缩,然后使用map和join迭代这个和concat

rd1 = sc.parallelize(['a1', 'a2', 'a3', 'a4', 'a5', ])
rd2 = sc.parallelize(['b1', 'b2', 'b3', 'b4', 'b5', ])
rd1.zip(rd2).map(lambda x: x[0]+'_'+x[1]).collect()
rd1.zip(rd2).map(lambda x: '_'.join(x)).collect()
rd1.zip(rd2).map('_'.join).collect()

['a1_b1', 'a2_b2', 'a3_b3', 'a4_b4', 'a5_b5']
将“a1”与“b1”组合的规则是什么?你用“1”?把RDD想象成一袋大理石。其中没有预定义的顺序。所以列表的第一个元素不会自动与另一个列表的第一个元素组合。您需要定义一个规则。
rd1 = sc.parallelize(['a1', 'a2', 'a3', 'a4', 'a5', ])
rd2 = sc.parallelize(['b1', 'b2', 'b3', 'b4', 'b5', ])
rd1.zip(rd2).map(lambda x: x[0]+'_'+x[1]).collect()
rd1.zip(rd2).map(lambda x: '_'.join(x)).collect()
rd1.zip(rd2).map('_'.join).collect()

['a1_b1', 'a2_b2', 'a3_b3', 'a4_b4', 'a5_b5']