dataframe.show()是spark中的一个动作吗?

Rox*_*ana 6 apache-spark

我有以下代码:

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()
Run Code Online (Sandbox Code Playgroud)

该应用程序正常而快速地工作,直到show()count()步骤,它创建了40000个任务.

我的理解是df1.show()应该触发完整的df1创作并且 df1.count()应该非常快.我在这里错过了什么?为什么count()那么慢?

非常感谢,Roxana

Fel*_*ard 13

show确实是一个行动,但它足够聪明,知道什么时候不必运行一切.如果你有一个orderBy它也需要很长时间,但在这种情况下你所有的操作都是地图操作,因此不需要计算整个决赛桌.但是,count需要物理地通过整个表来计算它,这就是为什么它花了这么长时间.您可以通过添加orderByto df1的定义来测试我所说的内容- 然后它应该需要很长时间.

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

  • 是的,确实... orderBy 需要很长时间。 (2认同)

Leo*_*eon 5

show()默认情况下仅显示 20 行。如果第一个分区返回超过20行,则其余分区将不会被执行。

注意show有很多变化。如果您运行show(false)这意味着显示所有结果,则所有分区都将被执行,并且可能需要更多时间。所以,show()equalsshow(20)是一个部分动作