是否有更好的方法在Spark-SQL中在不同条件下编写多个联接?

时间:2019-01-16 12:16:19

标签: scala apache-spark apache-spark-sql

我有一个包含多列的原始数据框,为简化起见,它们分别是product_id,category_id,product_type。现在,我想将product_quality_level信息加入此数据框,但是该信息来自不同的来源。

现在,我需要过滤具有不同条件的原始数据框,然后将其与从不同来源获得的相应数据框结合起来,最后将这些数据框合并。

  1. productTypeOneDF(product_id,product_quality_level) (当product_type为1,2时,基于product_id进行左联接)

  2. productTypeTwoDF(product_id,category_id,product_quality_level) (当product_type为3,4时,基于product_id和category_id的左联接)

  3. 对于其他product_type,它们的默认product_quality_level为-1。

现在,我的代码编写如下

val originalDF = ... (product_id,product_type)

val type1DF = originalDF.filter("product_type in (1,2)")
         .join(productTypeOneDF,Seq("product_id"),"left")
val type2DF = originalDF.filter("product_type in (3,4)")
         .join(productTypeTwoDF,Seq("product_id","category_id"),"left")
val type3DF = originalDF.filter("product_type not in (1,2,3,4)")
         .withColumn("product_quality_level",lit(-1))

val allProductDF = type1DF.union(type2DF).union(type3DF)

但是有没有更好的方法来做这样的工作?

例如,

val resultDF = originalDF.when("").join()
                         .when("").join()
                         .when("").join()

0 个答案:

没有答案