2016-11-10 53 views
2

我有n列一個表,我會打電話給A.在此表中有一些我需要三列:星火加入掛起

  • 增值稅 - >字符串
  • 稅 - >字符串
  • 卡 - >字符串

增值稅可以爲空,但不能在同一時間。 對於增值稅號碼簿稅收的每個唯一對號碼,至少有一個號碼卡

我需要改變這個表,添加一列count_card中,我把基於卡片的數量的增值稅有充分的獨特組合文字。

所以,我已經做到了這一點:

val cardCount = A.groupBy("tax", "vat").count 

val sqlCard = udf((count: Int) => { 
    if (count > 1) 
    "MULTI" 
    else 
    "MONO" 
}) 

val B = cardCount.withColumn(
      "card_count", 
      sqlCard(cardCount.col("count")) 
     ).drop("count") 

在表BI現在有三列:

  • 增值稅 - >字符串
  • 稅 - >字符串
  • card_count - > Int

以及對此的每項操作DataFrame很流暢。現在

,因爲我想導入新列一個表,我進行了以下連接:

val result = A.join(B, 
     B.col("tax")<=>A.col("tax") and 
     B.col("vat")<=>A.col("vat") 
    ).drop(B.col("tax")) 
     .drop(B.col("vat")) 

期待有原始表A和列card_count

問題是連接掛起,獲取所有系統資源阻塞pc。

的附加細節:

  • 具有〜1.5M的元素和從鑲木文件中讀取;
  • B有〜130萬個元素。
  • 系統是8線程和30GB的RAM

讓我知道我做錯了

回答

1

最後,我沒有發現這是問題,所以我改變做法

val cardCount = A.groupBy("tax", "vat").count 

val cardCountSet = cardCount.filter(cardCount.col("count") > 1) 
    .rdd.map(r => r(0) + " " + r(1)).collect().toSet 

val udfCardCount = udf((tax: String, vat:String) => { 
    if (cardCountSet.contains(tax + " " + vat)) 
    "MULTI" 
    else 
    "MONO" 
}) 

val result = A.withColumn("card_count", 
      udfCardCount(A.col("tax"), A.col("vat"))) 

如果有人知道一個更好的辦法讓我知道它