Как преобразовать регистр else в when в противном случае в spark dataframes

#scala #apache-spark #apache-spark-sql #teradata

#scala #apache-spark #apache-spark-sql #teradata

Вопрос:

Я хотел бы переписать код teradata в spark dataframes с помощью scala, столкнувшись с ошибкой «когда () не может быть применен после применения в противном случае () «, помощь приветствуется.

Teradata

   CASE WHEN
    CASE WHEN ID <> cid OR Group <> sg OR ead IS NULL THEN 1 
    ELSE 
        CASE WHEN HFlag <> hg AND ad   TBreak < ActivityDate THEN 1 
        ELSE 
          CASE WHEN HFlag = hg AND HFlag = 1 THEN 
            CASE WHEN ead   1 < ActivityDate THEN 
              CASE WHEN ead   TBreak < ActivityDate THEN 1 
              ELSE 0 END 
            ELSE 0 END 
            WHEN HFlag = hg AND HFlag = 0 THEN 
            CASE WHEN ead   TBreak < ActivityDate THEN 1 
            ELSE 0 END 
          ELSE 0 END 
        END 
    END = 1 THEN Row_Number() Over(ORDER BY ID, Group, ActivityDate, HFlag) 
    ELSE 0 END AS arctic
 

Я попробовал следующим образом.

 val windowRank = Window.orderBy('ID, 'Group, 'ActivityDate, 'HFlag)

  df.withColumn("arctic",
    when(when(col("ID") =!= col("cid") || col("Group") =!= col("sg") || col("ad").isNull, 1)
      .when(col("HFlag") =!= col("hg") amp;amp; (col("ad")   col("TBreak")) < col("ActivityDate"), 1)
      .when(col("HFlag") === col("hg") amp;amp; col("HFlag") === 1,
        when((col("ad")   1) < col("ActivityDate"),
          when((col("ad")   col("TBreak")) < col("ActivityDate"), 1)
            .otherwise(0))
          .otherwise(0)
          .when(col("HFlag") === col("hg") amp;amp; col("HFlag") === 0, when((col("ad")   col("TBreak")) < col("ActivityDate"), 1))
          .otherwise(0))
      .otherwise(0) === 1, row_number() over windowRank)
      .otherwise(0))
 

Ответ №1:

Вы пропустили закрывающую скобку

 val windowRank = Window.orderBy('ID, 'Group, 'ActivityDate, 'HFlag)

  df.withColumn("arctic",
    when(when(col("ID") =!= col("cid") || col("Group") =!= col("sg") || col("ad").isNull, 1)
      .when(col("HFlag") =!= col("hg") amp;amp; (col("ad")   col("TBreak")) < col("ActivityDate"), 1)
      .when(col("HFlag") === col("hg") amp;amp; col("HFlag") === 1,
        when((col("ad")   1) < col("ActivityDate"),
          when((col("ad")   col("TBreak")) < col("ActivityDate"), 1)
            .otherwise(0))
          .otherwise(0))  // <-- missing close bracket
          .when(col("HFlag") === col("hg") amp;amp; col("HFlag") === 0, when((col("ad")   col("TBreak")) < col("ActivityDate"), 1))
          .otherwise(0))
      .otherwise(0) === 1, row_number() over windowRank)
      .otherwise(0))