2016-04-09 13 views
-1

Aynı kişi için iki farklı dönem olan iki veri çerçevem ​​var. Her bir satır için, iki veri çerçevesinin 5 (sabit) sütununda herhangi bir değişiklik olursa, anlamak isterim.İki veri çerçevesine ait satırlardaki farkları nasıl kontrol edeceğiniz

önce:

+--+------+------+------+------+------+------+ 
|id| sport| var1| var2| var3| var4| var5| 
+--+------+------+------+------+------+------+ 
| 1|soccer|330234|  |  |  |  | 
| 2|soccer| null| null| null| null| null| 
| 3|soccer|330101|  |  |  |  | 
| 4|soccer| null| null| null| null| null| 
| 5|soccer| null| null| null| null| null| 
| 6|soccer| null| null| null| null| null| 
| 7|soccer| null| null| null| null| null| 
| 8|soccer|330024|330401|  |  |  | 
| 9|soccer|330055|330106|  |  |  | 
|10|soccer| null| null| null| null| null| 
|11|soccer|390027|  |  |  |  | 
|12|soccer| null| null| null| null| null| 
|13|soccer|330101|  |  |  |  | 
|14|soccer|330059|  |  |  |  | 
|15|soccer| null| null| null| null| null| 
|16|soccer|140242|140281|  |  |  | 
|17|soccer|330214|  |  |  |  | 
|18|soccer|  |  |  |  |  | 
|19|soccer|330055|330196|  |  |  | 
|20|soccer|210022|  |  |  |  | 
+--+------+------+------+------+------+------+ 

sonra:

+--+------+------+------+------+------+------+ 
|id| sport| var1| var2| var3| var4| var5| 
+--+------+------+------+------+------+------+ 
| 1|soccer|330234|  |  |  |  | 
| 2|soccer| null| null| null| null| null| 
| 3|soccer|330101|  |  |  |  | 
| 4|soccer| null| null| null| null| null| 
| 5|soccer| null| null| null| null| null| 
| 6|soccer| null| null| null| null| null| 
| 7|soccer| null| null| null| null| null| 
| 8|soccer| null| null| null| null| null| 
| 9|soccer|330106|  |  |  |  | 
|10|soccer| null| null| null| null| null| 
|11|soccer|390027|  |  |  |  | 
|12|soccer| null| null| null| null| null| 
|13|soccer| null| null| null| null| null| 
|14|soccer|330128|330331|330106|330059|  | 
|15|soccer| null| null| null| null| null| 
|16|soccer|140242|140281|140010|  |  | 
|17|soccer|330214|  |  |  |  | 
|18|soccer| null| null| null| null| null| 
|19|soccer|330196|  |  |  |  | 
|20|soccer|210022|  |  |  |  | 
+--+------+------+------+------+------+------+ 

ben arkaya ait sütunlarda farklılıklara taramak için nasıl biliyorum ama iki farklı veri çerçevelerinin satırlarını karşılaştırmak ne kadar güzel clueless .

İdeal çıkış olacaktır:

+--+------+------+ 
|id| sport| diff| 
+--+------+------+ 
| 1|soccer|  0| 
| 2|soccer|  0| 
| 3|soccer|  0| 
| 4|soccer|  0| 
| 5|soccer|  0| 
| 6|soccer|  0| 
| 7|soccer|  0| 
| 8|soccer|  1| 
| 9|soccer|  1| 
|10|soccer|  0| 
|11|soccer|  0| 
|12|soccer|  0| 
|13|soccer|  1| 
|14|soccer|  1| 
|15|soccer|  0| 
|16|soccer|  1| 
|17|soccer|  0| 
|18|soccer|  0| 
|19|soccer|  1| 
|20|soccer|  0| 

cevap

2

Böyle bir şey ifade ediyor mu? örnek verilerle başlayalım:

// Extract var columns 
val varCols = before.columns.drop(2) 

// Generate a list of exprs 
// CAST(NOT(before.var1 <=> after.var1) AS INT) 
val equalsExprs = varCols.map(
    c => not(col(s"before.$c") <=> col(s"after.$c")).cast("int").alias(s"${c}_ne")) 

// SUM 
val diff = equalsExprs.foldLeft(lit(0))(_ + _).alias("diff") 

O davranacak: Eşit

  • herhangi bir değere ve NULL olarak değil

    • iki NULL

      val before = Seq(
          (1, "soccer", Some(1), Some(2), Some(3), Some(4), None), 
          (2, "soccer", None, Some(0), None, None, Some(0)), 
          (3, "soccer", None, None, None, None, None) 
      ).toDF("id", "sport", "var1", "var2", "var3", "var4", "var5") 
      
      val after = Seq(
          (1, "soccer", Some(1), Some(2), Some(3), Some(4), None), // Zero diffs 
          (2, "soccer", Some(1), Some(0), None, None, Some(0)), // One diff 
          (3, "soccer", Some(1), Some(1), Some(1), Some(1), Some(1)) // Five diffs 
      ).toDF("id", "sport", "var1", "var2", "var3", "var4", "var5") 
      

      farklılıkları sayar bir ifade oluşturun Eşit olmayan

    • iki NULL olmayan değer - standart eşitlik

    katılın ve ifadeyi seçin:

    val diffs = before.as("before").join(after.as("after"), Seq("id", "sport")) 
        .select($"id", $"sport", diff) 
    
    diffs.show 
    
    // +---+------+----+ 
    // | id| sport|diff| 
    // +---+------+----+ 
    // | 1|soccer| 0| 
    // | 2|soccer| 1| 
    // | 3|soccer| 5| 
    // +---+------+----+ 
    
  • +0

    değil sadece farklılıkları sayar bir ifade yazmak mümkün olup olmadığını merak ediyorum, ancak bu farklılıkların bir ekleme veya geçerli duruma bir çıkarma olup olmadığını da anlar . "Bazı (1), Bazı (2), Yok, Yok, Yok" ve daha sonra "Bazı (1), Bazı (2), Bazı (3), Bazı (4), Yok" gibi ifadelerden önce 'Yok, Yok, Yok, Yok, Yok '... ikisi de 2 değişiklik, ama ilk durumda bir +2, ikincisinde ise -2 – user299791

    İlgili konular