使用Spark和Scala通过数据帧实现SQL逻辑

使用Spark和Scala通过数据帧实现SQL逻辑,scala,apache-spark,Scala,Apache Spark,在配置单元表t1中有三列c1、c2、c3。我有MySQL代码来检查特定列是否为空。我有来自同一个表的数据帧。我想通过dataframe,df实现相同的逻辑,df有三列,c1,c2,c3 下面是SQL- if( t1.c1=0 Or IsNull(t1.c1), if( IsNull(t1.c2/t1.c3), 1, t1.c2/t1.c3 ), t1.c1 ) AS myalias 我在scala中起草了以下逻辑,使用when作为SQL的if的替代。我在写作或逻辑上遇到问题,请参见下文。如何使

在配置单元表t1中有三列c1、c2、c3。我有MySQL代码来检查特定列是否为空。我有来自同一个表的数据帧。我想通过dataframe,df实现相同的逻辑,df有三列,c1,c2,c3

下面是SQL-

if(
t1.c1=0 Or IsNull(t1.c1),
if(
IsNull(t1.c2/t1.c3),
1,
t1.c2/t1.c3
),
t1.c1
) AS myalias
我在scala中起草了以下逻辑,使用when作为SQL的if的替代。我在写作或逻辑上遇到问题,请参见下文。如何使用Scala通过Spark dataframe编写上述SQL逻辑

val df_withalias = df.withColumn("myalias",when(
  Or((df("c1") == 0), isnull(df("c1"))),
  when(
    (isNull((df("c2") == 0)/df("c3")),
  )
)
)
如何编写上述逻辑?

首先,可以使用列的| |运算符构造逻辑OR条件。另外-请注意,当仅接受2个参数条件和值时,如果您想提供一个替代值以在条件不满足时使用,则需要使用。否则:

val df_withalias = df.withColumn("myalias",
  when(df("c1") === 0 || isnull(df("c1")),
    when(isnull(df("c2")/df("c3")), 1).otherwise(df("c2")/df("c3"))
  ).otherwise(df("c1"))
)