gpt4 book ai didi

apache-spark - dataframe.show() 是 Spark 中的一个 Action 吗?

转载 作者:行者123 更新时间:2023-12-03 07:08:47 26 4
gpt4 key购买 nike

我有以下代码:

val df_in = sqlcontext.read.json(jsonFile) // the file resides in hdfs

//some operations in here to create df as df_in with two more columns "terms1" and "terms2"

val intersectUDF = udf( (seq1:Seq[String], seq2:Seq[String] ) => { seq1 intersect seq2 } ) //intersects two sequences
val symmDiffUDF = udf( (seq1:Seq[String], seq2:Seq[String] ) => { (seq1 diff seq2) ++ (seq2 diff seq1) } ) //compute the difference of two sequences

val df1 = (df.withColumn("termsInt", intersectUDF(df("terms1"), df1("terms2") ) )
.withColumn("termsDiff", symmDiffUDF(df("terms1"), df1("terms2") ) )
.where( size(col("termsInt")) >0 && size(col("termsDiff")) > 0 && size(col("termsDiff")) <= 2 )
.cache()
) // add the intersection and difference columns and filter the resulting DF

df1.show()
df1.count()

show() 之前,应用程序运行正常且快速,但在 count() 步骤中,它创建了 40000 个任务。

我的理解是,df1.show() 应该触发完整的 df1 创建,并且 df1.count() 应该非常快。我在这里缺少什么?为什么 count() 这么慢?

提前非常感谢您,罗克珊娜

最佳答案

show确实是一个 Action ,但它足够聪明,知道什么时候不需要运行所有东西。如果您有 orderBy这也会花费很长时间,但在这种情况下,所有操作都是映射操作,因此不需要计算整个最终表。然而,count需要物理地遍历整个表才能计算它,这就是为什么它需要这么长时间。您可以通过添加 orderBy 来测试我所说的内容。至df1的定义 - 那么它应该需要很长时间。

编辑:此外,40k 任务可能是由于 DF 分区的分区数量造成的。尝试使用df1.repartition(<a sensible number here, depending on cluster and DF size>)并再次尝试计数。

关于apache-spark - dataframe.show() 是 Spark 中的一个 Action 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com