我使用mydf.createorreplacetempview(“combine\u table”)在sparksql中使用Dataframe创建了一个临时表。所有字段数据类型都显示为字符串。在这个temp表中,我有4列procuredvalue、minmargin、maxmargin、price和其他一些列。现在我需要根据某些条件选择数据,并且必须将数据显示为新列“最终价格”。我试图用case语句来做这件事,但得到下面的错误。输入不匹配的'1st\u case'期望eof(第3行,位置5)有人能建议我该怎么做吗。
val d1=spark.sql(""" SELECT cast(PV as FloatType),cast(mxM as FloatType),
cast(mnM as FloatType ) , cast(procuredValue+ mxM as FloatType) as 1st_case,
cast(PV+ mnM as FloatType) as 2nd_case,
case
WHEN 1st_case < price THEN 1st_case
WHEN 2ndcse < price THEN 2ndcse
WHEN PV <price && saleevent = 'Sp' THEN 'price'
WHEN price < 'PV' && saleevent = 'Sp' && sclass = 'VH' THEN 0.9* PV
ELSE PV
END AS Final_price
FROM combine_table""")
3条答案
按热度按时间46qrfjad1#
这么多问题。。。
不能用双引号括住查询,也不能用双引号限定其中的字符串(没有正确的转义)。
更简单更干净的解决方案是这样做:
p、 习惯于对sql字符串使用单引号。与双引号不同,它适用于所有sql方言。
'min_val_seller.Q'
是字符串文本Spark中的逻辑与
and
,不是&&
case语句以两个相同的条件开始(Sum(i.procuredvalue + i.maxmargin) < min_val_seller.q
). 第二个条件永远不会被选择。(请确保您了解案例的工作原理)
iso连接是在90年代引入的。没有理由使用where条件而不是正确的连接语法。
mwkjh3gx2#
谢谢@david上面的查询为我工作。
4xy9mtcn3#
你的问题怎么了?
sql格式化程序
sql验证程序