簡體   English   中英

Spark增強數據集之間的TB級連接

[英]Spark Enhance Join between Terabytes of Datasets

我有五個Hive表,假設名稱分別為A,B,C,D和E。對於每個表,都有一個customer_id作為它們之間連接的鍵。 另外,每個表至少包含100:600列,所有列均為Parquet格式。

下表的示例:

CREATE TABLE table_a 
(
customer_id Long, 
col_1 STRING,
col_2 STRING,
col_3 STRING,
.
.
col_600 STRING
)
STORED AS PARQUET;

我需要達到兩點,

  • 使用Spark Scala,以最佳方式將所有這些對象結合在一起。 我在加入之前嘗試對sortByKey進行sortByKey ,但是仍然存在性能瓶頸。 我在加入之前嘗試通過鍵進行reparation ,但是性能仍然不佳。 我試圖提高Spark的並行度,使其具有許多執行程序,使其達到6000,但無法獲得良好的結果。
  • 加入后,我需要為其中一些列應用單獨的功能。

我在下面嘗試的聯接示例,

val dsA =  spark.table(table_a)
val dsB =  spark.table(table_b) 
val dsC =  spark.table(table_c) 
val dsD =  spark.table(table_d) 
val dsE =  spark.table(table_e) 
val dsAJoineddsB = dsA.join(dsB,Seq(customer_id),"inner")

我認為在這種情況下,直接聯接不是最佳情況。 您可以使用以下簡單方法來完成此任務。

  • 首先,創建帶有兩個字段的case class FeatureData(customer_id:Long, featureValue:Map[String,String])例如FeatureDatacase class FeatureData(customer_id:Long, featureValue:Map[String,String])
  • 其次,您將每個表映射到FeatureData案例類鍵[feature_name,feature_value]
  • 第三,您將對groupByKeyunion用相同的密鑰合並所有數據集。

通過以上方法,合並比加入要快。 但是它需要更多的工作。

之后,您將擁有一個包含鍵映射的數據集。 您將對key, Map(feature_name)應用轉換。

實施的簡單示例如下:首先將dataset映射到case class然后可以將它們全部合並。 之后,您將對groupByKey進行映射並縮小它。

case class FeatureMappedData(customer_id:Long, feature: Map[String, String])
val dsAMapped = dsA.map(row ⇒
        FeatureMappedData(row.customer_id,
          Map("featureA" -> row.featureA,
            "featureB" -> row.featureB)))
val unionDataSet = dsAMapped  union dsBMapped 
unionDataSet.groupByKey(_.customer_id)
      .mapGroups({
        case (eid, featureIter) ⇒ {
      val featuresMapped: Map[String, String] = featureIter.map(_.feature).reduce(_ ++ _).withDefaultValue("0") 
      FeatureMappedData(customer_id, featuresMapped)
    }
  })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM