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