fmv*_*992 3 random performance scala apache-spark
我正在尝试使用 Scala 从现有表中执行一个简单的随机样本,其中包含大约 100e6 条记录。
import org.apache.spark.sql.SaveMode
val nSamples = 3e5.toInt
val frac = 1e-5
val table = spark.table("db_name.table_name").sample(false, frac).limit(nSamples)
(table
.write
.mode(SaveMode.Overwrite)
.saveAsTable("db_name.new_name")
)
Run Code Online (Sandbox Code Playgroud)
但它花费的时间太长(据我估计约为 5 小时)。
有用的信息:
我有〜6名工人。通过分析表的分区数我得到:11433
。
我不确定分区/工人的比例是否合理。
我正在使用 Scala 运行 Spark 2.1.0。
我努力了:
移除.limit()
零件。
更改frac
为1.0
、0.1
等
问题:我怎样才能让它更快?
最好的,
限制绝对值得取消,但真正的问题是采样需要完整的数据扫描。不管分数有多低,时间复杂度仍然是O(N) *。
如果您不需要良好的统计属性,您可以尝试通过首先对数据文件进行采样,然后从缩减的数据集中进行子采样来限制首先加载的数据量。如果数据均匀分布,这可能会相当有效。
否则,除了扩展集群之外,您无能为力。
* 简单随机采样和数据帧 SAMPLE 函数如何在 Apache Spark (Scala) 中工作?