Spark Scala - сравнение значений столбцов, а затем сравнение результатов с другим столбцом - PullRequest
1 голос
/ 02 июля 2019

У меня есть данные, как показано ниже.Содержит идентификатор продукта, стоимость изготовления, налог 1, налог 2 и ППМ.Поэтому я должен создать новую колонку, определяющую цену продажи предмета.Отпускная цена показывает следующее условие

  • Если стоимость изготовления + налог 1 И стоимость изготовления + налог 2 больше, чем ППМ, тогда ППМ будет окончательной ценой
  • Если стоимость + налог1 ИЛИ Себестоимость + налог 2 меньше, чем ППМ, тогда цена продажи будет либо составлять стоимость + налог 1 ИЛИ делать стоимость + налог 2, которая всегда выше (НО не должна быть больше, чем ППМ)

Пример MC + TX1 = 70, MC + TX2 = 80, MRP = 100, затем Цена продажи = 80

, если MC + TX1 = 170, MC + TX2 = 80, MRP = 100, затем продажацена = 80, поскольку один из MC + tx1 или MX + tx2 меньше, чем MRP, тогда мы примем, что

MC + TX1 = 170, MC + TX2 = 180, MRP = 100, затем цена продажи= 100

 +------------+-------------+-------+-------+-----+--+
 | Product ID | Making Cost | Tax 1 | Tax 2 | MRP |  |
 +------------+-------------+-------+-------+-----+--+
 | 12345      | 50          | 20    | 30    | 100 |  |
 | 23456      | 50          | 60    | 30    | 100 |  |
 | 34567      | 50          | 60    | 70    | 100 |  |
 +------------+-------------+-------+-------+-----+--+

Желаемый выход

| Product ID | Making Cost | Tax 1 | Tax 2 | MRP | Selling Price |
|------------|-------------|-------|-------|-----|---------------|
| 12345      | 50          | 20    | 30    | 100 | 80            |
| 23456      | 50          | 60    | 30    | 100 | 80            |
| 34567      | 50          | 60    | 70    | 100 | 100           |

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Вы можете использовать, когда для всех условий, как показано ниже

val df = spark.sparkContext.parallelize(Seq(
    (12345, 50, 20, 30, 100),
    (23456, 50, 60, 30, 100),
    (34567, 50, 60, 70, 100)
  ))
    .toDF("ID", "MC", "T1", "T2", "MRP")


  df.withColumn("SP",
    when((($"MC" + $"T1").gt($"MRP")) && (($"MC" + $"T2").gt($"MRP")), $"MRP")
      .otherwise(
        when((($"MC" + $"T1").lt($"MRP")) && (($"MC" + $"T2").lt($"MRP")), greatest(($"MC" + $"T1"), ($"MC" + $"T2")))
          .otherwise(
            when((($"MC" + $"T1").gt($"MRP")), $"MC" + $"T2")
              .otherwise($"MC" + $"T1")
          )
        )
  ).show(false)

ВЫВОД:

+-----+---+---+---+---+---+
|ID   |MC |T1 |T2 |MRP|SP |
+-----+---+---+---+---+---+
|12345|50 |20 |30 |100|80 |
|23456|50 |60 |30 |100|80 |
|34567|50 |60 |70 |100|100|
+-----+---+---+---+---+---+

Чтобы повысить эффективность, вы можете вычислить все MC+T1 и M+T2 ранее, чтобы вам не приходилось каждый раз вычислять, а потом отбрасывать, если вы этого не хотите.

0 голосов
/ 02 июля 2019

Вы можете сделать это с помощью spark sql или с помощью API dataframe

df.withColumn("selling_price", 
  when((col("MC") + col("TX1") < col("MC") + col("TX2")) && (col("MC") + col("TX2") < col("MRP") , col("MC") + col("TX2"))     
 .when((col("MC") + col("TX1") > col("MRP")) && (col("MC") + col("TX2") > col("MRP") , col("MRP"))
 .otherwise(col("MC") + col("TX1")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...