使用地图创建数据框会导致酸洗错误

时间:2019-06-14 22:49:55

标签: python pyspark apache-spark-sql

出于某种背景,我试图将一个数据帧(df1)中的行与另一数据帧(df2)中的相似行进行匹配。我想以一个数据帧结束,该数据帧具有df1的每一行,每一行都有df2的行的副本。

例如,我创建了2个数据框,如下所示:

  df1     df2
+-----+ +-----+
|value| |value|
+-----+ +-----+
|    0| |    2|
|    1| |    3|
+-----+ +-----+

(这些是pyspark.sql.dataframe.DataFrame个数据帧)
最终的数据帧应如下所示:

+-----+
|value|
+-----+
|    0| <- from df1
|    2| <- clone of df2
|    3|
|    1| <- from df1
|    2| <- clone of df2
|    3|
+-----+

我尝试创建此数据框的方法是通过地图和联合。我尝试的第一步是创建df2的重复列表,然后可以与df1合并以创建所需的数据框。

def foo(row):
  return df2.limit(2)

listOfCopies = df1.rdd.map(foo)
print(listOfCopies.take(2))

我希望listOfCopies.take(2)的输出是2个数据帧的列表,但是我收到了错误PicklingError: Could not serialize object: TypeError: 'JavaPackage' object is not callable

我在这里做什么错了?

1 个答案:

答案 0 :(得分:0)

正如PMende所评论的那样,我无法从函数映射df2内部找到使用df1的方法。相反,我最终使用了一系列连接来完成任务。

Spark的ML管道函数approxSimilarityJoin可以满足我的要求,尽管它是为df1df2具有要比较的列(例如字符串或哈希)的情况而设计的。