我是scala / spark的新手(现在大约一个星期)
我的8核笔记本电脑64位Win10正在运行以下代码 数据框有1700行。 ONE选择需要十秒钟。
观察控制台显示主要挂起:
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等的经验) 我假设我的火花配置有问题吗?
欢迎任何建议。
直到挂起的完整控制台输出如下:
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:修剪目录:
答案 0 :(得分:1)
将数据帧放在缓存中会产生很大的不同。
val dfMergedDroppedDeletedCached:DataFrame=dfMergedDroppedDeleted.cache()
但是,缓存过程本身很慢,所以只有在执行多项操作时才能获得回报
<强>更新强> 感谢Ramesh Maharjan在评论中写道:
耗时部分未选择。 select在本质上是分布式的,并且将在执行程序中的每个本地数据中执行。耗时的部分是收集。收集功能收集驱动程序节点中的所有数据。这需要很多时间。这就是为什么总是建议不要使用收集,如果有必要,最低限度使用它。
我已将查询更改为:
val majorstr:String = dfMergedDroppedDeletedCached.filter(dfMergedDroppedDeletedCached(major).isNotNull)
.select(col(major))
.limit(1)
.first().getString(0)
不完全是Oracle速度,但比使用collect
快得多