Spark连接挂起

时间:2016-11-10 14:43:18

标签: join apache-spark

我有一个包含n列的表,我将其称为A.在此表中,我需要三列:

  • 增值税 - >串
  • 税 - >串
  • 卡 - >串

vat tax 可以为null,但不能同时为null。 对于每个独特的 vat tax ,至少有一个

我需要更改此表格,添加一列 count_card ,其中我根据卡片的数量放置了一个文本 tax vat的每个独特组合有。

所以我做到了这一点:

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

在表B中,我现在有三列:

  • 增值税 - >串
  • 税 - >串
  • card_count - > INT

并且此DataFrame上的每个操作都是平滑的。

现在,因为我想在 A 表中导入新列,所以我执行了以下连接:

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 列。

问题是连接挂起,导致所有系统资源阻塞了电脑。

其他详情:

  • A 有~1.5M元素,可从镶木地板文件中读取;
  • B 有~130万个元素。
  • 系统是一个8线程和30GB的RAM

让我知道我做错了什么

1 个答案:

答案 0 :(得分: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")))

如果有人知道更好的方法让我知道

相关问题