Scala / Spark选择列非常慢

时间:2017-09-02 20:05:20

标签: scala apache-spark

我是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:修剪目录:

1 个答案:

答案 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

快得多
相关问题