Есть ли лучший способ написать несколько соединений при разных условиях в spark-sql? - PullRequest
0 голосов
/ 16 января 2019

У меня есть оригинальный фрейм данных с несколькими столбцами, чтобы упростить их: product_id, category_id, product_type. Теперь я хочу присоединить информацию о product_quality_level к этому фрейму данных, но информация поступает из разных источников.

Теперь мне нужно отфильтровать исходный фрейм данных с различными условиями, затем объединить с соответствующим фреймом данных, полученным из разных источников, и в конце объединить эти фреймы данных.

  1. productTypeOneDF (product_id, product_quality_level) (левое соединение на основе product_id, когда product_type равно 1,2)

  2. productTypeTwoDF (идентификатор продукта, идентификатор категории, уровень качества продукта) (левое соединение на основе product_id и category_id, когда product_type равно 3,4)

  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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...