小编Ben*_*zar的帖子

Collect() 调用用于 UDF 函数,该函数返回相当大的列(总共 2 列)以避免 crossJoin

问题如下:

'genre', 'top_tags' (250 rows)
----------------
Action, Array('bleeding', 'dying', 'guns', ...) - can hold up to 50k max. (avg is 4000)
Drama,  Array('crying', 'hard life', 'street') 
Run Code Online (Sandbox Code Playgroud)

另一个表格包含电影、类型及其相关标签

'movie', 'genre', 'tags'. (DataFrame size, around 23M Rows)
------------------------
M1        Action,  'guns', 'dying', 'bleeding', 'outside', 'worldwide'.  approx ~10 records for each movie
Run Code Online (Sandbox Code Playgroud)

我想迭代每部电影,并尝试通过比较标签来扩展其类型相似性。 没有模糊算法,只是精确匹配。

我想返回一个数据帧(相同的电影、流派、标签数据帧),其中包含名为的新列potentially_related_genres和流派列表。

在我看来,我有两个选择:

  1. crossJoin并使用 UDF 比较两列,但这会很糟糕,因为它会让我迭代 5,750,000,000 行。(交叉连接输出)

  2. 腌制结果(collect()对第一个数据帧(250 行)进行操作,然后在 UDF 中使用所有逻辑,这通过调用原始数据帧并使用 withColumn

DF.withColumn('potentially_related_genres', my_udf('genre', 'tags'))

该方法的问题在于,传递给驱动程序是一个相当大的收集(记住胖列 top_tags )。并将其转移给所有要使用的工人。(酸洗和脱酸)

有什么建议吗?

提前致谢。

python apache-spark apache-spark-sql pyspark

6
推荐指数
0
解决办法
244
查看次数

标签 统计

apache-spark ×1

apache-spark-sql ×1

pyspark ×1

python ×1