如何在scala spark中保存我们从dataFrame动态生成的列表
我基本上调用了这个函数两次,以获取用于不同目的的列表。我只想知道是否有一种方法可以将列表保留在内存中,我们不必一次又一次地调用相同的函数来生成列表,只需在scala spark中生成一次列表。此时您必须进行持久化或缓存如何在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
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
}
}