Shu*_*ain 5 python apache-spark apache-spark-sql pyspark
我有一个大小约为 25 GB 的大型 Spark 数据框,我必须将其与另一个大小约为 15 GB 的数据框连接起来。
现在,当我运行代码时,大约需要 15 分钟才能完成
资源分配为 40 个执行器,每个执行器 128 GB 内存
当我查看它的执行计划时,正在执行排序合并连接。
问题是:
连接在相同键但不同的表上执行大约 5 到 6 次,因为在每次执行连接合并/连接数据之前,需要花费大部分时间对数据进行排序并共同定位分区。
那么有没有什么方法可以在执行连接之前对数据进行排序,这样就不会为每个连接执行排序操作,或者以这样的方式进行优化,从而减少排序时间并增加实际连接数据的时间?
我只想在执行连接之前对数据帧进行排序,但不知道该怎么做?
例如:
如果我的数据框加入 id 列
joined_df = df1.join(df2,df1.id==df2.id)
Run Code Online (Sandbox Code Playgroud)
在加入之前如何根据“id”对数据帧进行排序,以便分区位于同一位置?
那么有没有什么方法可以在执行连接之前对数据进行排序,这样就不会为每个连接执行排序操作,或者以这样的方式进行优化,从而减少排序时间并增加实际连接数据的时间?
闻起来像桶。
分桶是一种优化技术,使用桶(和分桶列)来确定数据分区并避免数据洗牌。
这个想法是针对bucketBy数据集的,这样 Spark 就知道键是位于同一位置的(已经预先洗牌)。参与连接的 DataFrame 之间的存储桶数量和存储列数必须相同。
请注意,Hive 或 Spark 表 ( ) 支持此功能saveAsTable,因为存储桶元数据是从元存储(Spark 或 Hive)获取的。
| 归档时间: |
|
| 查看次数: |
3208 次 |
| 最近记录: |