Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 更改aSspark数据框中列值的日期格式_Scala_Apache Spark_Dataframe_Apache Spark Sql - Fatal编程技术网

Scala 更改aSspark数据框中列值的日期格式

Scala 更改aSspark数据框中列值的日期格式,scala,apache-spark,dataframe,apache-spark-sql,Scala,Apache Spark,Dataframe,Apache Spark Sql,我正在Spark 2.0中将Excel工作表读入Dataframe,然后尝试将MM/DD/YY格式中带有日期值的一些列转换为YYYY-MM-DD格式值是字符串格式。下面是示例: +---------------+--------------+ |修改|创建| +---------------+--------------+ |空| 12/4/17 13:45| | 2/20/18| 2/2/18 20:50| | 3/20/18| 2/2/18 21:10| |

我正在Spark 2.0中将Excel工作表读入
Dataframe
,然后尝试将
MM/DD/YY
格式中带有日期值的一些列转换为
YYYY-MM-DD
格式值是字符串格式。下面是示例:

+---------------+--------------+
|修改|创建|
+---------------+--------------+
|空| 12/4/17 13:45|
|        2/20/18|  2/2/18 20:50|
|        3/20/18|  2/2/18 21:10|
|        2/20/18|  2/2/18 21:23|
|        2/28/18|12/12/17 15:42| 
|        1/25/18| 11/9/17 13:10|
|        1/29/18| 12/6/17 10:07| 
+---------------+--------------+
我希望将此转换为:

+---------------+-----------------+
|修改|创建|
+---------------+-----------------+
|空| 2017-12-04 13:45|
|     2018-02-20| 2018-02-02 20:50|
|     2018-03-20| 2018-02-02 21:10|
|     2018-02-20| 2018-02-02 21:23|
|     2018-02-28| 2017-12-12 15:42| 
|     2018-01-25| 2017-11-09 13:10|
|     2018-01-29| 2017-12-06 10:07| 
+---------------+-----------------+
所以我试着做:

 df.withColumn("modified",date_format(col("modified"),"yyyy-MM-dd"))
   .withColumn("created",to_utc_timestamp(col("created"),"America/New_York"))
但它在我的结果中给出了所有
NULL
值。我不确定我会错在哪里。我知道,创建的
上的
to_utc_timestamp
会将整个时间戳转换为utc。理想情况下,我希望保持时间不变,只更改日期格式。有没有办法实现我的目标?我哪里做错了

任何帮助都将不胜感激。谢谢。

简单明了:

df.select(
  to_date($"modified", "MM/dd/yy").cast("string").alias("modified"), 
  date_format(to_timestamp($"created", "MM/dd/yy HH:mm"), "yyyy-MM-dd HH:mm").alias("created"))
火花>=2.2.0 您需要将
添加到\u日期
到\u时间戳
内置函数作为

你应该有

+----------+-------------------+
|modified  |created            |
+----------+-------------------+
|null      |2017-12-04 13:45:00|
|2018-02-20|2018-02-02 20:50:00|
|2018-03-20|2018-02-02 21:10:00|
|2018-02-20|2018-02-02 21:23:00|
|2018-02-28|2017-12-12 15:42:00|
|2018-01-25|2017-11-09 13:10:00|
|2018-01-29|2017-12-06 10:07:00|
+----------+-------------------+
对我来说,使用
utc
时区并没有改变时间

火花<2.2.0
输出数据帧与上面相同

谢谢您的回答!但是,当我使用
更新时
只接受
类型的一个参数。它不接受模式字符串作为第二个参数。它从2.2.0开始提供。我的spark版本是2.0。我应该使用不同的方法吗?我使用的是spark 2.0
to_timestamp
不可用,并且
to_date
只接受一个参数,是否可以使用其他方法?
+----------+-------------------+
|modified  |created            |
+----------+-------------------+
|null      |2017-12-04 13:45:00|
|2018-02-20|2018-02-02 20:50:00|
|2018-03-20|2018-02-02 21:10:00|
|2018-02-20|2018-02-02 21:23:00|
|2018-02-28|2017-12-12 15:42:00|
|2018-01-25|2017-11-09 13:10:00|
|2018-01-29|2017-12-06 10:07:00|
+----------+-------------------+
import org.apache.spark.sql.functions._
val temp = df.withColumn("modified", from_unixtime(unix_timestamp(col("modified"), "MM/dd/yy"), "yyyy-MM-dd"))
  .withColumn("created", to_utc_timestamp(unix_timestamp(col("created"), "MM/dd/yy HH:mm").cast(TimestampType), "UTC"))