Scala中如何打印Spark DataFrame的shape及大数据集下的效率问题
Scala Spark 获取 DataFrame shape 的实现方案与效率分析
实现代码
和PySpark的逻辑一致,Scala中可以直接通过以下代码获取(行数,列数)的结果:
// 直接打印结果 println((df.count(), df.columns.length)) // 也可以存为变量,格式和Pandas返回的数组对齐 val shape = List(df.count(), df.columns.length)
大数据集下的效率说明
这个方案的两部分操作效率差异很大:
- 列数获取:属于元数据操作,完全不需要扫描业务数据,直接从驱动端存储的DataFrame Schema中就能读取,效率是O(1),不管数据集多大都不会有耗时压力。
- 行数获取:
count()属于行动算子,会触发一次完整的Spark任务,扫描所有分区的数据统计总条数:如果是未缓存的冷数据、或刚经过宽依赖转换(比如join、group by)的数据集,全量count的耗时会随数据量增长线性上升,超大数据集下执行效率很低。
优化方案
- 若需要频繁查询该DataFrame的行数,提前对数据做缓存:
df.cache(),第一次count完成后后续的行数查询就可以直接从缓存中读取,不需要重跑任务。 - 若允许一定误差,可以使用近似统计接口,不需要全量扫描就能快速得到接近真实值的行数:
// 示例:最长等待1秒,置信度95%的近似行数统计 val approxRowCount = df.rdd.countApprox(1000, 0.95).getFinalValue.mean val approxShape = List(approxRowCount, df.columns.length)
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

