如何在加入pyspark数据帧时提高性能

如何在加入pyspark数据帧时提高性能,pyspark,apache-spark-sql,query-performance,Pyspark,Apache Spark Sql,Query Performance,我有2个pyspark DataFrames,第一个包含~500.000行,第二个包含~300.000行。我做了2次连接,在第二次连接中,将从第二个数据帧(300.000行)中逐单元格获取,并将其与第一个数据帧(500.000行)中的所有单元格进行比较 所以,有一个非常缓慢的连接。我在加入之前广播了数据帧 测试1: df_join = df1.join(F.broadcast(df2), df1.String.contains(df2["search.subString"]), "left")

我有2个pyspark DataFrames,第一个包含
~500.000行
,第二个包含
~300.000行
。我做了2次连接,在第二次连接中,将从第二个数据帧(300.000行)中逐单元格获取,并将其与第一个数据帧(500.000行)中的所有单元格进行比较

所以,有一个非常缓慢的连接。我在加入之前广播了数据帧

测试1:

df_join = df1.join(F.broadcast(df2), df1.String.contains(df2["search.subString"]), "left") 
这项工作花了好几个小时才完成

测试2:

df_join = F.broadcast(df1).join(F.broadcast(df2), df1.String.contains(df2["search.subString"]), "left")
运行速度比上面的第一个代码慢,所以性能很差

我试图在加入之前缓存数据帧

我用过:

df.cache()
用于每个数据帧。但是,性能总是不好

我试图仅在内存中使用
持久化

df.persist(MEMORY_ONLY) ==> NameError: global name 'MEMORY_ONLY' is not defined
df.persist(StorageLevel.MEMORY_ONLY) ==> NameError: global name 'StorageLevel' is not defined
如何在内存中持久化数据帧

你能给我建议一个提高性能的解决方案吗

提前谢谢

使用

df=df.cache()

打印(df.count())


基本上,您需要调用一个操作来获得缓存的效果。

从pyspark.sql导入StorageLevel
,您必须导入moduleA regex类型的连接将总是非常缓慢。你不能在python中合并它吗?@samkart我已经添加了它,但是我得到了错误:ImportError:无法导入名称StorageLevelAh!我想应该是pyspark import StorageLevel的
@samkart嗨,你对这个问题有什么想法吗?谢谢