内存高效的笛卡尔加入PySpark

时间:2017-02-06 14:20:08

标签: apache-spark pyspark cartesian-product cross-join

我有一个庞大的字符串数据集,可以放入我的spark集群中单个节点的内存中。问题是它占用了单个节点的大部分内存。

这些ID长约30个字符。例如:

ids
O2LWk4MAbcrOCWo3IVM0GInelSXfcG
HbDckDXCye20kwu0gfeGpLGWnJ2yif
o43xSMBUJLOKDxkYEQbAEWk4aPQHkm

我希望写一个包含所有id对的列表。例如:

id1,id2
O2LWk4MAbcrOCWo3IVM0GInelSXfcG,HbDckDXCye20kwu0gfeGpLGWnJ2yif
O2LWk4MAbcrOCWo3IVM0GInelSXfcG,o43xSMBUJLOKDxkYEQbAEWk4aPQHkm
HbDckDXCye20kwu0gfeGpLGWnJ2yif,O2LWk4MAbcrOCWo3IVM0GInelSXfcG
# etc...

所以我需要自己交叉加入数据集。我希望使用10节点集群在PySpark上执行此操作,但它需要内存效率。

1 个答案:

答案 0 :(得分:8)

pySpark将轻松处理您的数据集并提高内存效率,但处理10 ^ 8 * 10 ^ 8条记录需要时间(这是交叉连接结果的估计大小)。请参阅示例代码:

from pyspark.sql.types import *
df = spark.read.csv('input.csv', header=True, schema=StructType([StructField('id', StringType())]))
df.withColumnRenamed('id', 'id1').crossJoin(df.withColumnRenamed('id', 'id2')).show()