Scala 从ApacheSpark中的文本文件中查找rdd中存储的数据大小

Scala 从ApacheSpark中的文本文件中查找rdd中存储的数据大小,scala,apache-spark,apache-spark-1.4,Scala,Apache Spark,Apache Spark 1.4,我是Apache Spark(版本1.4.1)的新手。我编写了一个小代码来读取文本文件,并将其数据存储在Rdd中 是否有一种方法可以获取rdd中的数据大小 这是我的代码: import org.apache.spark.SparkContext import org.apache.spark.rdd.RDD import org.apache.spark.util.SizeEstimator import org.apache.spark.sql.Row object RddSize {

我是Apache Spark(版本1.4.1)的新手。我编写了一个小代码来读取文本文件,并将其数据存储在Rdd中

是否有一种方法可以获取rdd中的数据大小

这是我的代码:

import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.util.SizeEstimator
import org.apache.spark.sql.Row

object RddSize {

  def main(args: Array[String]) {

    val sc = new SparkContext("local", "data size")
    val FILE_LOCATION = "src/main/resources/employees.csv"
    val peopleRdd = sc.textFile(FILE_LOCATION)

    val newRdd = peopleRdd.filter(str => str.contains(",M,"))
    //Here I want to find whats the size remaining data
  }
} 

我想在筛选转换之前(peopleRdd)和之后(newRdd)获取数据大小。

我不确定您是否需要这样做。您可以缓存rdd并在Spark UI中检查大小。但假设您确实希望以编程方式实现这一点,这里有一个解决方案

    def calcRDDSize(rdd: RDD[String]): Long = {
        //map to the size of each string, UTF-8 is the default
        rdd.map(_.getBytes("UTF-8").length.toLong) 
           .reduce(_+_) //add the sizes together
    }
然后,您可以为两个RDD调用此函数:

println(s"peopleRdd is [${calcRDDSize(peopleRdd)}] bytes in size")
println(s"newRdd is [${calcRDDSize(newRdd)}] bytes in size")

即使文件大小大于集群中可用的内存,此解决方案也应能正常工作。

Spark API文档说明:

  • 您可以从Spark上下文获取有关RDD的信息:
    sc.getRDDStorageInfo
  • RDD信息包括内存和磁盘大小:

  • 有多种方法可以获得RDD大小

    1.在spark上下文中添加spark侦听器

    SparkDriver.getContext.addSparkListener(new SparkListener() {
    override def onStageCompleted(stageCompleted: SparkListenerStageCompleted) {
      val map = stageCompleted.stageInfo.rddInfos
      map.foreach(row => {
          println("rdd memSize " + row.memSize)
          println("rdd diskSize " + row.diskSize)
       })
    }})
    
    二,。将rdd另存为文本文件

    myRDD.saveAsTextFile("person.txt")
    
    然后打电话

    三,。你也可以试试


    你说的“尺寸”是什么意思?RDD中的行数?如果是这样,“count”RDD函数将执行以下操作-
    def count():Long从Spark文档返回RDD中的元素数。
    。@Paul否,这里的size不表示行数。假设我的文件大小为100MB,那么我在rdd中获得了文件数据并应用了过滤器。数据的大小必须减小。我想要那个尺寸(MB)对不起,再说一遍。为什么?除非这是最终答案,不需要更多的处理。在这种情况下,将其写入一个文件并查看文件大小。我不明白为什么知道它在内存中消耗的大小是有意义的。请进一步解释为什么需要剩余筛选的大小。Spark的工作原理(并获得其性能)是“懒惰”,只在需要结果时进行实际计算。因此,通常,在计算的中间没有“剩余”的大小,因为计算还没有完成。所以请解释一下你想要做的事情——因为很可能知道中间的大小不是必要的,或者会对性能产生负面影响。你为什么想知道尺寸?你一直告诉我你想知道尺寸,但为什么?你打算怎么处理这个答案?如果您想在创建表之前知道表在内存中的大小,那么不,我认为这是不可能的。我不是太迟钝,我不知道知道知道RDD是100Mb、90Mb或110Mb会对你有什么帮助。我不想缓存RDD。它将获取内存中的数据,不需要。嗨,也可以转换为数据帧吗?谢谢!!我将尝试这些,并让您知道在任何情况下issues@Gabber:很好的解释:)thanx@RamPrasadG
    /applications/[app-id]/stages
    
    val rddSize = SizeEstimator.estimate(myRDD)