为什么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")