[英]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;
我需要达到两点,
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])
例如FeatureData
, case class FeatureData(customer_id:Long, featureValue:Map[String,String])
groupByKey
, union
用相同的密钥合并所有数据集。 通过以上方法,合并比加入要快。 但是它需要更多的工作。
之后,您将拥有一个包含键映射的数据集。 您将对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.