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 列

Scala Spark,比较两个 DataFrame 并选择另一列的值

R - 创建几列非零最小值的新列

scala/spark 代码中不允许在配置单元中添加列

在 spark scala 中对数据框的每一列进行排序

Scala Spark,如何为列添加值