2016-10-13 15 views
5

Tôi có đoạn mã sau:Là dataframe.show() một hành động trong tia lửa?

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() 

Ứng dụng này được hoạt động bình thường và nhanh chóng cho đến khi show() nhưng trong bước count(), nó tạo ra 40000 nhiệm vụ.

Hiểu biết của tôi là df1.show() phải kích hoạt việc tạo đầy đủ df1df1.count() sẽ rất nhanh. Tôi đang thiếu gì ở đây? tại sao là count() chậm?

Cảm ơn bạn rất nhiều trước, Roxana

Trả lời

6

show thực sự là một hành động, nhưng nó là đủ thông minh để biết khi nào nó không nhất thiết phải chạy tất cả mọi thứ. Nếu bạn có số orderBy cũng sẽ mất rất nhiều thời gian, nhưng trong trường hợp này, tất cả các thao tác của bạn là hoạt động trên bản đồ và do đó không cần phải tính toán toàn bộ bảng cuối cùng. Tuy nhiên, count cần phải thể chất đi qua toàn bộ bảng để đếm nó và đó là lý do tại sao nó mất quá lâu. Bạn có thể kiểm tra những gì tôi đang nói bằng cách thêm một định nghĩa orderBy vào định dạng df1 - sau đó sẽ mất nhiều thời gian.

EDIT: Ngoài ra, các tác vụ 40k có thể do số lượng phân vùng mà DF của bạn được phân đoạn thành. Hãy thử sử dụng df1.repartition(<a sensible number here, depending on cluster and DF size>) và thử đếm lại.

+0

Có, thực sự ... orderBy mất nhiều thời gian. – Roxana

+0

'coalesce' có lẽ tốt hơn' repartition' vì nó tránh được sự lộn xộn. – LiMuBei

+0

Lưu ý cho tương lai :) –

Các vấn đề liên quan