【发布时间】:2020-11-16 01:47:28
【问题描述】:
我已经看到并尝试了许多关于此问题的 existing StackOverflow 帖子,但没有一个有效。我想我的 JAVA 堆空间没有我的大型数据集预期的那么大,我的数据集包含 650 万行。我的 Linux 实例包含 4 核的 64GB 内存。根据suggestion,我需要修复我的代码,但我认为从 pyspark 数据帧制作字典的成本应该不会很高。如果有其他方法可以计算,请告诉我。
我只想从我的 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_of_cc_pn_li 作为 key 和 id 作为 列表 值的字典。
预期输出
{
"90cb0946cf4139e12": ["BOND-9129450", "BOND-7175508"]
"d5c301f00e9966483": ["BOND-1742850","BOND-7630290"]
}
到目前为止我所尝试的,
%%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]
我现在在控制台上得到了什么:
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)
【问题讨论】:
-
不确定它最终是否有帮助,但作为第一步,您可以尝试将列表集合分发为
df.groupby("hash_of_cc").agg(collect_list("id")).show()。然后再仔细看看,决定是否真的需要将完整的数据帧收集到驱动程序。
标签: java python apache-spark pyspark