Pyspark查询加入数据框查询需要太多时间

问题描述 投票:0回答:1

我有两个数据集,一个数据集的大小为11 GB,另一个为2 GB。

这里有两个数据集:

Dataset 1:具有域的IP范围值。

Dataset 1

数据集2:仅具有需要在这些IP范围内检查的IP地址。

Dataset 2

我想做的是将这两个数据集合并,并从数据集1中找出匹配的IP范围。

我使用了以下配置:

spark.conf.set("spark.sql.shuffle.partitions", 25)
spark.conf.set("spark.sql.autoBroadcastJoinThreshold", -1)
spark.conf.set("spark.sql.broadcastTimeout", 1000)

这是我使用的联接:

data = bldf.join(broadcast(ipdf), ((bldf.ip_number >=  ipdf.from_ip) & (bldf.ip_number <= ipdf.to_ip)))

所以我的问题是它显示了加入结果。但是,当我尝试查询新数据帧时,它花费了大量时间,并且所有CPU都很高。

我正在尝试计算所有记录,并计算新数据框中不同的列记录。另外,我尝试将这个数据框保存到Parque文件中,它也永远不会结束。

我在这里做错了什么?这里需要进行任何优化吗?

pyspark pyspark-sql pyspark-dataframes
1个回答
0
投票

为什么您的分区只有25个,为什么autobroadcastjoins设置为-1?您的较小表为2gb,使用spark时,您的广播可以达到8gb(使用spark 2.4),因此将autobroadcatjoin设置为2gb或更高,然后将数据重新分区为100个或更多分区。如果您加入的表是13gb,则每个分区超过128mb(带有25个分区),这很糟糕。因此,加入后,您只需重新分配到120-150,然后坚持下去即可。 df.repartition(150).persist(StorageLevel.MEMORY_AND_DISK)然后进行计数,因为计数是一项繁重的操作,将所有内容带到了驱动程序节点,并且由于分区过载,垃圾回收和内存利用率很高。

© www.soinside.com 2019 - 2024. All rights reserved.