Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在scala spark中保存我们从dataFrame动态生成的列表_Scala_Apache Spark - Fatal编程技术网

如何在scala spark中保存我们从dataFrame动态生成的列表

如何在scala spark中保存我们从dataFrame动态生成的列表,scala,apache-spark,Scala,Apache Spark,我基本上调用了这个函数两次,以获取用于不同目的的列表。我只想知道是否有一种方法可以将列表保留在内存中,我们不必一次又一次地调用相同的函数来生成列表,只需在scala spark中生成一次列表。此时您必须进行持久化或缓存 def getAnimalName(dataFrame: DataFrame): List[String] = { dataFrame.select("animal"). filter(col("animal").isNotNull && c

我基本上调用了这个函数两次,以获取用于不同目的的列表。我只想知道是否有一种方法可以将列表保留在内存中,我们不必一次又一次地调用相同的函数来生成列表,只需在scala spark中生成一次列表。

此时您必须进行持久化或缓存

 def getAnimalName(dataFrame: DataFrame): List[String] = {
    dataFrame.select("animal").
      filter(col("animal").isNotNull && col("animal").notEqual("")).
      rdd.map(r => r.getString(0)).distinct().collect.toList
  }
然后调用函数,如下所示

dataFrame.select("animal").
      filter(col("animal").isNotNull && col("animal").notEqual("")).
      rdd.map(r => r.getString(0)).distinct().persist
需要多少次就有多少次,无需重复该过程。
我希望它能有所帮助。

尝试以下方法,您也可以使用
time
func检查性能。 还可以内联查找代码解释

def getAnimalName(dataFrame: DataFrame): List[String] = {
    dataFrame.collect.toList
  }

您是否希望使用Spark功能来持久化Scala列表?或者您正在寻找缓存Spark数据帧?我正在寻找一种方法,该方法可以有效地使用Spark功能,如果有任何问题,请允许我问另一个问题。你希望它能在两次spark训练之间存活下来吗?或者你只需要在一个spark作业中持久化它吗?我希望列表在spark会话中持久化
import org.apache.spark.rdd
import org.apache.spark.sql.functions._
import org.apache.spark.sql.{DataFrame, functions}

object HandleCachedDF {

  var cachedAnimalDF : rdd.RDD[String] = _
  def main(args: Array[String]): Unit = {
    val spark = Constant.getSparkSess
    val df = spark.read.json("src/main/resources/hugeTest.json") // Load your Dataframe
    val df1 = time[rdd.RDD[String]] {
      getAnimalName(df)
    }
    val resultList = df1.collect().toList
    val df2 = time{
      getAnimalName(df)
    }
    val resultList1 = df2.collect().toList
    println(resultList.equals(resultList1))
  }

  def getAnimalName(dataFrame: DataFrame): rdd.RDD[String] = {
    if (cachedAnimalDF == null) { // Check if this the first initialization of your dataframe
      cachedAnimalDF = dataFrame.select("animal").
        filter(functions.col("animal").isNotNull && col("animal").notEqual("")).
        rdd.map(r => r.getString(0)).distinct().cache() // Cache your dataframe
    }
    cachedAnimalDF // Return your cached dataframe
  }

  def time[R](block: => R): R = { // COmpute the time taken by function to execute
    val t0 = System.nanoTime()
    val result = block // call-by-name
    val t1 = System.nanoTime()
    println("Elapsed time: " + (t1 - t0) + "ns")
    result
  }

}