【问题标题】:Spark Scala - Comparing columns values and then comparing result with another columnSpark Scala - 比较列值,然后将结果与另一列进行比较
【发布时间】:2019-07-02 16:43:57
【问题描述】:

我有如下数据。其中包含产品 ID、制造成本、税 1、税 2 和 MRP。 所以我必须创建新的列来决定商品的售价。 售价显示遵循以下条件

  • 如果制造成本 + 税 1 AND 制造成本 + 税 2 大于 MRP,则 MRP 将是最终价格
  • 如果制造成本 + 税 1 或制造成本 + 税 2 小于 MRP,则销售价格将是制造成本 + 税 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           |

【问题讨论】:

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


    【解决方案1】:

    以下所有条件都可以使用when

    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+T1M+T2,这样您就不必每次都计算并在以后不想要时丢弃。

    【讨论】:

      【解决方案2】:

      您可以使用 spark sql 或 dataframe API 来实现

      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")))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多