如何在spark sql语句中获得多个输入?

如何在spark sql语句中获得多个输入?,sql,database,scala,apache-spark,Sql,Database,Scala,Apache Spark,我曾尝试将2个输入传递到sql语句中,但它显示的错误与不匹配的输入类似。 数据集=序列(“Y”,“02012021”).toDF(“fg”,“dob”) 查询是: 如果FG=“Y”,则这是一条成员记录,则这必须是MMDDYYYY格式的过去有效日期,并且传入值必须为8字节长 如果FG!='Y'那么这是可选的: 那么,如果FG!='Y'并提供,但无效,然后为空。空/空白ok spark.sql("""select *, case when FA_MBR_Selected

我曾尝试将2个输入传递到sql语句中,但它显示的错误与不匹配的输入类似。 数据集=序列(“Y”,“02012021”).toDF(“fg”,“dob”)

查询是: 如果FG=“Y”,则这是一条成员记录,则这必须是MMDDYYYY格式的过去有效日期,并且传入值必须为8字节长

如果FG!='Y'那么这是可选的: 那么,如果FG!='Y'并提供,但无效,然后为空。空/空白ok

spark.sql("""select *, case when FA_MBR_Selected_FG = "Y" and length(dob) = 8 and to_date(dob,'MMddyyyy') then dob else '' end as dob, case when
FA_MBR_Selected_FG = "Y" and length(dob) = 8 and to_date(dob,'MMddyyyy') then 'Y' else 'NULL' end as dob_flag from input""").show(false)

请使用case when语句为上述查询提供spark sql语句。

使用
when
函数

检查下面的代码

样本数据

scala> val df = Seq(
("Y","02012021"),
("Y","0201202"),
("N","02012021"),
("Y","02-01-2021"),
("Y","31022021"),
("Y","01022020")
).toDF("fg","dob")
df: org.apache.spark.sql.DataFrame = [fg: string, dob: string]
sparksql

spark
    .sql(
      """
        |SELECT
        |   *,
        |   (
        |    case
        |       when fg = 'Y'
        |            and length(dob) = 8
        |            and to_date(dob,'MMddyyyy') is not null
        |       then
        |            dob
        |       else null
        |       end
        |   ) as new_dob
        |FROM hivetbl
        |""".stripMargin
    ).show(false)

// Exiting paste mode, now interpreting.

+---+----------+--------+
|fg |dob       |new_dob |
+---+----------+--------+
|Y  |02012021  |02012021|
|Y  |0201202   |null    |
|N  |02012021  |null    |
|Y  |02-01-2021|null    |
|Y  |31022021  |null    |
|Y  |01022020  |01022020|
+---+----------+--------+
更改为\u日期(dob,'MMddyyyy')
更改为
更改为\u日期(dob,'MMddyyyy')不为空

尝试下面的查询

spark.sql("""select *, case when FA_MBR_Selected_FG = "Y" and length(dob) = 8 and to_date(dob,'MMddyyyy') is not null then dob else '' end as dob, case when
FA_MBR_Selected_FG = "Y" and length(dob) = 8 and to_date(dob,'MMddyyyy') then 'Y' else 'NULL' end as dob_flag from input""").show(false)

请使用flag-----------------spark.sql(“在MMDDYYYY中选择FA\u MBR\u Selected\u FG时选择case,然后使用substring(FA\u MBR\u Selected\u FG,1,8)else”结束为FA\u MBR\u Selected\u FG,在mmddyyyyy中选择FA\u MBR\u FG时选择case,然后使用“Y”else“无效日期格式”结束从输入中选择FA\u MBR\u FG\u FG”。显示(“无效”)以下查询中存在数据类型不匹配,请更正它------输入:val sample=Seq((“N”,“02011999”)。toDF(“FA_MBR_Selected_FG”,“dob”)-查询:spark.sql(““”select*,case when FA_MBR_Selected_FG=“Y”和length(dob)=8和to_date(dob,'MMddyyyy'))不为空则dob else“”结束为dob,如果选择了FAU MBR_FG=“Y”和长度(dob)=8,则结束为日期(dob,'MMddyyyy'),然后是'Y'else'null'结束为dob_标志,来自输入“”)。show(false)org.apache.spark.sql.AnalysisException:无法解析'((输入。
FAU MBR_Selected_FG
=“Y”)和(长度(输入。
dob
)=8))和结束为日期(输入。
dob
,'MMddyyyy'))由于数据类型不匹配,在“(((输入。
FA_MBR_选择的_FG
='Y')、长度(输入。
dob
)=8”)和截止日期(输入。
dob
,'mmddyyyyy')(布尔值和日期)中的类型不同。第1行第17位;我现在已经更新了!!仍然显示相同的错误bro
spark.sql("""select *, case when FA_MBR_Selected_FG = "Y" and length(dob) = 8 and to_date(dob,'MMddyyyy') is not null then dob else '' end as dob, case when
FA_MBR_Selected_FG = "Y" and length(dob) = 8 and to_date(dob,'MMddyyyy') then 'Y' else 'NULL' end as dob_flag from input""").show(false)