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