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

时间:2016-10-13 15:03:53

标签: 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()

该应用正常且快速地工作到show(),但在count()步骤中,它会创建40000个任务。

我的理解是df1.show()应该触发完整的df1创建,而df1.count()应该非常快。我在这里错过了什么?为什么count()会变慢?

非常感谢您提前, Roxana的

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:0)

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

注释show有很多变化。如果运行show(false)(这表示显示所有结果),则将执行所有分区,并且可能需要更多时间。因此,show()等于show(20),这是部分操作

答案 2 :(得分:0)

以下是.show()的文档:
https://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=show#pyspark.sql.DataFrame.show\ 如您所见,这是 PySpark DataFrames的操作。

show(n=20, truncate=True, vertical=False)

一个例子:

>>> df
DataFrame[age: int, name: string]
>>> df.show()
+---+-----+
|age| name|
+---+-----+
|  2|Alice|
|  5|  Bob|
+---+-----+