Performance cartesianproduct的Spark性能调整

Performance cartesianproduct的Spark性能调整,performance,apache-spark,Performance,Apache Spark,我想连接两个数据集,第一个数据集是4.5GB,第二个数据集是5MB 下面是我的疑问 val data= rdd1.join(rdd2,regexp_replace($"rdd2.SUBSCRIBER_ID","^0*","") === regexp_replace($"rdd1.subscriberid","^0*", "" ) or ((substring($"rdd2.FIRST_NAME",0,3) === $"rdd1.firstName") and (substring($"r

我想连接两个数据集,第一个数据集是4.5GB,第二个数据集是5MB

下面是我的疑问

val data= rdd1.join(rdd2,regexp_replace($"rdd2.SUBSCRIBER_ID","^0*","") === regexp_replace($"rdd1.subscriberid","^0*", "" ) or
    ((substring($"rdd2.FIRST_NAME",0,3) === $"rdd1.firstName") and (substring($"rdd2.LAST_NAME",0,4) === $"rdd1.lastName") and (regexp_replace(substring($"rdd2.BIRTH_DATE",0,10),"-","") === $"rdd1.DOB")) or
    ((substring($"rdd2.FIRST_NAME",0,3) === $"rdd1.firstName") and (substring($"rdd2.LAST_NAME",0,4) === $"rdd1.lastName")  and ($"rdd2.GENDER" === $"rdd1.gender")) or 
    ((substring($"rdd2.FIRST_NAME",0,3) === $"rdd1.firstName") and (regexp_replace(substring($"rdd2.BIRTH_DATE",0,10),"-","") === $"rdd1.DOB") and ($"rdd2.GENDER" === $"rdd1.gender")) or 
    ((substring($"rdd2.LAST_NAME",0,4) === $"rdd1.lastName") and (regexp_replace(substring($"rdd2.BIRTH_DATE",0,10),"-","") === $"rdd1.DOB") and ($"rdd2.GENDER" === $"rdd1.gender")))
它作为笛卡尔连接运行,用于rdd2的广播,但没有性能

我正在使用这些属性

--num-executors 30 --driver-memory 12G --executor-memory 30G  --executor-cores 6

--conf spark.sql.shuffle.partitions=2001 --conf spark.serializer=org.apache.spark.serializer.KryoSerializer 
--conf spark.cleaner.ttl=800 --conf spark.debug.maxToStringFields=1000
我们有300个vcores可供选择

如何更改查询以获得更好的性能


非常感谢您的帮助。

请尝试删除洗牌分区配置,并将核心仅保留为2-4

请尝试让我知道结果。

删除了“或”条件,创建了多个数据帧,并完成了所有的联合

val data= rdd1.join(rdd2,regexp_replace($"rdd2.SUBSCRIBER_ID","^0*","") === regexp_replace($"rdd1.subscriberid","^0*", "" )) 
val data1 = rdd1.join(rdd2,((substring($"rdd2.FIRST_NAME",0,3) === $"rdd1.firstName") and (substring($"rdd2.LAST_NAME",0,4) === $"rdd1.lastName") and (regexp_replace(substring($"rdd2.BIRTH_DATE",0,10),"-","") === $"rdd1.DOB")))
val data2 = rdd1.join(rdd2,((substring($"rdd2.FIRST_NAME",0,3) === $"rdd1.firstName") and (substring($"rdd2.LAST_NAME",0,4) === $"rdd1.lastName")  and ($"rdd2.GENDER" === $"rdd1.gender")))
val data3 =  rdd1.join(rdd2,((substring($"rdd2.FIRST_NAME",0,3) === $"rdd1.firstName") and (regexp_replace(substring($"rdd2.BIRTH_DATE",0,10),"-","") === $"rdd1.DOB") and ($"rdd2.GENDER" === $"rdd1.gender")))
val data4= rdd1.join(rdd2,((substring($"rdd2.LAST_NAME",0,4) === $"rdd1.lastName") and (regexp_replace(substring($"rdd2.BIRTH_DATE",0,10),"-","") === $"rdd1.DOB") and ($"rdd2.GENDER" === $"rdd1.gender")))

val finaldata = data union data1 union data2 union data3 union data4

你能给我们看一下数据的结果吗?解释一下吗?仍然是一样的,作业从40分钟后就卡在了一个地方。[第五阶段:======================================================================>(398+2)/400]数据源是什么,无论是来自HDFS还是任何rdbms。数据倾斜也可能是一个问题。请您展示一下您的示例数据,以及您希望通过此次加入实现的具体目标。然后我可以建议是否有任何错误的sqlData在HDFS中。在rdd1中,我有5列,其中一列大小为2KB,我比较前4列,如果它们匹配(如上所述的条件),那么我将第5列写入输出。(很抱歉,我无法共享任何数据)对于相同的列,我多次看到相同的冗余联接条件。请删除它并重试,但我们确实有一个类似req的,从4个条件中,3个条件中的任何一个满足,我们应该写那行来输出,有什么解释吗?添加了解释