2 回答
TA贡献1802条经验 获得超5个赞
由于您spark.read.jdbc为某个表调用,spark 将尝试将整个表从数据库收集到 spark 中。之后,spark 缓存数据并从缓存中打印 10 个结果。如果您运行以下代码,您会注意到一些差异。
spark_session = SparkSession.builder.master("local[4]").appName("test_log_processing").getOrCreate()
url = "jdbc:mysql://localhost:3306"
table = "(SELECT * FROM test.fakelog LIMIT 10) temp"
properties = {"user": "myUser", "password": "********"}
df = spark_session.read.jdbc(url, table, properties=properties)
df.cache()
df.show()
spark_session.stop()
TA贡献1853条经验 获得超18个赞
也许您的内存缓存已被填满,缓存的默认值曾经只是内存(较旧的 spark 版本)。
因此,您可以尝试使用 df.persist(StorageLevel.MEMORY_AND_DISK) 代替缓存。当内存太满时,它会溢出到磁盘。
试试 .take(10),它会给出行的集合,它可能不会更快,但值得一试
尝试 df.coalesce(50).persist(StorageLevel.MEMORY_AND_DISK),如果您有过度分区的数据帧,则无需洗牌即可正常工作
如果这些都不起作用,则可能意味着您的计算集群无法处理此负载,您可能需要向外扩展。
添加回答
举报