【发布时间】:2018-12-05 05:39:05
【问题描述】:
我在由 5 个节点组成的 Spark 2.3 集群上,每个节点都有 12Gb 的可用内存,并且正在尝试使用大约 130Gb 的 Parquet 数据集,在此之上我创建了一个分区的外部 Hive 表。
假设我想知道数据集中的记录数。我最初的猜测是,Spark 会逐个分区读取数据,聚合当前分区以获取记录数,将结果传递给驱动程序,然后删除该分区以读取下一个分区。但是,要么这不是它的工作方式(相反,Spark 会首先尝试读取内存中的所有内容),要么我编码错误。
像sql("select count(*) from myhivetable") 这样的愚蠢方法不起作用:作业失败并出现 java 堆空间错误。 sql("select * from myhivetable").count() 也没有(我猜它们无论如何都会编译成相同的执行计划)。
我可能会忘记 hive 表,使用文件系统 API 获取包含该表的文件列表并逐个文件进行记录计数,将计数汇总到结果中,例如 fileList.foldLeft{ (recCount, file) => file.read(parquet).count + recCount} -- 但是, a)这种方法可能无法“扩展到”其他可能的用例,b)我仍然猜想应该有一种更优雅的方法来做到这一点,只需使用 Spark 工具集。我没看到吗?
【问题讨论】:
-
你能发布详细的错误,包括堆栈跟踪
标签: apache-spark apache-spark-sql large-data parquet