我已经看到并尝试了许多现有的关于这个问题的stackoverflow职位,但没有工作。我想我的java堆空间没有我的大数据集预期的那么大,我的数据集包含了650万行。我的linux示例包含64gbram和4个内核。根据这个建议,我需要修复我的代码,但我认为从pysparkDataframe制作一个字典应该不会非常昂贵。请告诉我,如果有任何其他方法来计算。
我只想用我的pyspark数据框做一个python字典,这是我的pyspark数据框的内容, property_sql_df.show()
显示,
+--------------+------------+--------------------+--------------------+
| id|country_code| name| hash_of_cc_pn_li|
+--------------+------------+--------------------+--------------------+
| BOND-9129450| US|Scotron Home w/Ga...|90cb0946cf4139e12...|
| BOND-1742850| US|Sited in the Mead...|d5c301f00e9966483...|
| BOND-3211356| US|NEW LISTING - Com...|811fa26e240d726ec...|
| BOND-7630290| US|EC277- 9 Bedroom ...|d5c301f00e9966483...|
| BOND-7175508| US|East Hampton Retr...|90cb0946cf4139e12...|
+--------------+------------+--------------------+--------------------+
我想做一个字典,用hash\u of \u cc\u pn\u li作为键,id作为列表值。
预期产量
{
"90cb0946cf4139e12": ["BOND-9129450", "BOND-7175508"]
"d5c301f00e9966483": ["BOND-1742850","BOND-7630290"]
}
我已经试过了,
方法1:导致java.lang.outofmemoryerror:java堆空间
%%time
duplicate_property_list = {}
for ind in property_sql_df.collect():
hashed_value = ind.hash_of_cc_pn_li
property_id = ind.id
if hashed_value in duplicate_property_list:
duplicate_property_list[hashed_value].append(property_id)
else:
duplicate_property_list[hashed_value] = [property_id]
方法2:由于缺少pyspark上的本机偏移量而无法工作
%%time
i = 0
limit = 1000000
for offset in range(0, total_record,limit):
i = i + 1
if i != 1:
offset = offset + 1
duplicate_property_list = {}
duplicate_properties = {}
# Preparing dataframe
url = '''select id, hash_of_cc_pn_li from properties_df LIMIT {} OFFSET {}'''.format(limit,offset)
properties_sql_df = spark.sql(url)
# Grouping dataset
rows = properties_sql_df.groupBy("hash_of_cc_pn_li").agg(F.collect_set("id").alias("ids")).collect()
duplicate_property_list = { row.hash_of_cc_pn_li: row.ids for row in rows }
# Filter a dictionary to keep elements only where duplicate cound
duplicate_properties = filterTheDict(duplicate_property_list, lambda elem : len(elem[1]) >=2)
# Writing to file
with open('duplicate_detected/duplicate_property_list_all_'+str(i)+'.json', 'w') as fp:
json.dump(duplicate_property_list, fp)
我现在在控制台上看到的是:
java.lang.outofmemoryerror:java堆空间
并在jupyter笔记本输出上显示这个错误
ERROR:py4j.java_gateway:An error occurred while trying to connect to the Java server (127.0.0.1:33097)
这是我问的后续问题here:creating dictionary 从PyparkDataframe显示outofmemoryerror:java堆空间
1条答案
按热度按时间nlejzf6q1#
为什么不在执行器中保存尽可能多的数据和处理,而不是收集给驱动程序呢?如果我理解正确,你可以用
pyspark
转换和聚合并直接保存到json,因此利用执行器,然后将json文件(可能已分区)作为字典加载回python。诚然,您引入了io开销,但这应该允许您绕过oom堆空间错误。循序渐进:检查输出路径:
加载到python作为
dict
:最后
我希望这有帮助!谢谢你的好问题!