为什么2018-01年在Scala和#x2B中改为2017年;火花?

为什么2018-01年在Scala和#x2B中改为2017年;火花?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,输出为: val str = "2018-01" var df = Seq((10,"2018-01-22")).toDF("sno","date") df.show df.createOrReplaceTempView("dd") var ddf = spark.sql("select sno,date," + str.toString + " as new from dd") ddf.show 为什么将str.toString改为“2017”而不是“2018-01”将“2018-01”

输出为:

val str = "2018-01"
var df = Seq((10,"2018-01-22")).toDF("sno","date")

df.show
df.createOrReplaceTempView("dd")

var ddf = spark.sql("select sno,date," + str.toString + " as new from dd")
ddf.show
为什么将
str.toString
改为“2017”而不是“2018-01”

将“2018-01”解释为
2018-1
(减法),等于2017年。要避免这种情况,请在字符串周围添加单引号:

str: String = 2018-01 
df: org.apache.spark.sql.DataFrame = [sno: int, date: string] 
+---+----------+ 
|sno|      date| 
+---+----------+ 
| 10|2018-01-22|
 +---+----------+ 

ddf: org.apache.spark.sql.DataFrame = [sno: int, date: string ... 1 more field] 
+---+----------+----+ 
|sno| date     | new| 
+---+----------+----+ 
| 10|2018-01-22|2017| 
+---+----------+----+
无需将
添加到字符串
,因为它已经是一个字符串。这将为您提供预期的输出:

spark.sql("select sno,date,'" + str + "' as new from dd")

改变值的不是
str.toString
,而是select语句,该语句将2018-01解释为2017年的算术运算(这是正确和预期的行为)。 如果希望保留str的值,请在select语句中用引号将str.toString括起来。像这样:

+---+----------+-------+
|sno|      date|    new|
+---+----------+-------+
| 10|2018-01-22|2018-01|
+---+----------+-------+
var ddf = spark.sql("select sno,date,'"+str.toString+"' as new from dd")