Scala/Spark 选择列非常慢
Posted
技术标签:
【中文标题】Scala/Spark 选择列非常慢【英文标题】:Scala/Spark Select Column very slow 【发布时间】:2017-09-02 20:05:19 【问题描述】:我是 scala/spark 的新手(现在大约一个星期)
以下代码正在我的 8 核笔记本电脑上运行,64 位,Win10 数据框有 1700 行。 一个选择需要十秒钟以上。
观察控制台显示主要挂起在这一点上:
17/09/02 12:23:46 INFO FileSourceStrategy:修剪目录:
代码
val major:String =name.substring(0,name.indexOf("_SCORE"))+"_idx1"
println(major)
val majors = dfMergedDroppedDeleted
.select(col(major))
.collect().toSeq
println(s"got majors $majors.size")
这应该需要几毫秒(基于使用 hibernate、r、mysql 等的经验) 我假设我的 spark 配置有问题?
欢迎提出任何建议。
直到挂起的完整控制台输出如下:
1637_1636_1716_idx1
1637_1636_1716_idx2
17/09/02 12:23:08 INFO ContextCleaner:清洁的蓄能器 765
17/09/02 12:23:08 INFO ContextCleaner:清洁的蓄能器 763
17/09/02 12:23:08 INFO BlockManagerInfo:已删除内存中 192.168.0.13:62246 上的 broadcast_51_piece0(大小:113.7 KB,可用空间:901.6 MB)
17/09/02 12:23:08 INFO ContextCleaner:清洁的蓄能器 761
17/09/02 12:23:08 INFO ContextCleaner:清洁的蓄能器 764
17/09/02 12:23:08 INFO ContextCleaner:清洁的蓄能器 762
17/09/02 12:23:08 INFO ContextCleaner:清洁的蓄能器 766
17/09/02 12:23:08 INFO BlockManagerInfo:已删除内存中 192.168.0.13:62246 上的 broadcast_50_piece0(大小:20.7 KB,可用空间:901.6 MB)
17/09/02 12:23:08 INFO FileSourceStrategy:修剪目录:
【问题讨论】:
Spark 的构建目的与 MySQL 等数据库不同。你在哪里运行这个?在火花壳或提交?有多少个文件和多少个分区?在此之前你在运行什么代码? 我目前正在运行 junit 测试。从 csv 导入的一个数据文件。在此之前,已经有许多数据框转换,其中列已与 withColumn() 合并。我认为很多代码与这个问题无关,因为我现在有一个包含大约 1000 个变量和 1700 行的数据框 注意:这是数据清理操作的一部分。我通常在 R 中做的那种事情。 耗时部分未选中。 select本质上是分布式的,会在executors的每一个本地数据中执行。耗时的部分是收集。 Collect 函数收集驱动节点中的所有数据。这需要很多时间。这就是为什么始终建议不要使用 collect 并在必要时最少使用它的原因。 【参考方案1】:将数据帧放入缓存有很大的不同。
val dfMergedDroppedDeletedCached:DataFrame=dfMergedDroppedDeleted.cache()
但是,缓存过程本身很慢,因此只有在执行多个操作时才有效
更新 将 Ramesh Maharjan 归功于谁在评论中写道:
耗时的部分没有选择。 select本质上是分布式的,会在executors的每一个本地数据中执行。耗时的部分是收集。 Collect 函数收集驱动节点中的所有数据。这需要很多时间。这就是为什么始终建议不要使用 collect 并在必要时最少使用它的原因。
我已将查询更改如下:
val majorstr:String = dfMergedDroppedDeletedCached.filter(dfMergedDroppedDeletedCached(major).isNotNull)
.select(col(major))
.limit(1)
.first().getString(0)
不完全是 Oracle 的速度,但比使用 collect 快得多
【讨论】:
你也值得这个代表。如果您想以您的名义重新发布答案,我会很乐意删除我的。我不想“窃取”代表,只是想确定答案就在那里,因为据我所知,这在互联网上之前没有讨论过 让答案保持原样。你写的很完美。 :)以上是关于Scala/Spark 选择列非常慢的主要内容,如果未能解决你的问题,请参考以下文章
Scala Spark-> 从 DataFrame 中选择前 15 列