Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
Spark SQL将字符串转换为时间戳_Sql_Apache Spark_Apache Spark Sql_Pyspark Sql - Fatal编程技术网

Spark SQL将字符串转换为时间戳

Spark SQL将字符串转换为时间戳,sql,apache-spark,apache-spark-sql,pyspark-sql,Sql,Apache Spark,Apache Spark Sql,Pyspark Sql,我是Spark SQL新手,正在尝试在Spark数据帧中将字符串转换为时间戳。我在一个名为time_string的列中有一个字符串,看起来像'2017-08-01T02:26:59.000Z' 我将此字符串转换为时间戳的代码是 CAST (time_string AS Timestamp) 但这给了我一个时间戳2017-07-31 19:26:59 为什么要改变时间?有没有办法在不改变时间的情况下做到这一点 谢谢你的帮助 您可以使用函数将utc格式的日期转换为时间戳 val df2 = Seq

我是Spark SQL新手,正在尝试在Spark数据帧中将字符串转换为时间戳。我在一个名为time_string的列中有一个字符串,看起来像
'2017-08-01T02:26:59.000Z'

我将此字符串转换为时间戳的代码是

CAST (time_string AS Timestamp)
但这给了我一个时间戳
2017-07-31 19:26:59

为什么要改变时间?有没有办法在不改变时间的情况下做到这一点

谢谢你的帮助

您可以使用函数将utc格式的日期转换为时间戳

val df2 = Seq(("a3fac", "2017-08-01T02:26:59.000Z")).toDF("id", "eventTime")

df2.withColumn("eventTime1", unix_timestamp($"eventTime", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").cast(TimestampType))
输出:

+-------------+---------------------+
|userid       |eventTime            |
+-------------+---------------------+
|a3fac        |2017-08-01 02:26:59.0|
+-------------+---------------------+

希望这有帮助

基于Java的解决方案

有一些Spark SQL函数可以让您使用日期格式

转换示例:20181224091530->2018-12-24 09:15:30

解决方案(Spark SQL语句):

您可以通过使用org.apache.spark.SQL.SparkSession的实例来使用SQL语句。例如,如果要执行sql语句,Spark提供以下解决方案:

...
// You have to create an instance of SparkSession
sparkSession.sql(sqlStatement); 
...
注意事项:

  • 您必须将十进制转换为字符串,然后才能实现对时间戳格式的解析
  • 你可以用你想要的格式玩游戏
  • 在spark sql中,您可以使用来设置时间戳,然后根据需要对其进行格式化。 选择 日期格式(至时间戳(,'yyyy/MM/dd HH:MM:ss'),“yyy-MM-dd HH:MM:ss”)为 从

  • 此处带值的“timestamp”是2019/02/23 12:00:00,它是“event”表中的StringType列。 要转换为时间戳类型,请应用于时间戳(时间戳'yyyy/MM/dd HH:MM:ss)。需要确保时间戳的格式与列值相同。然后根据您的要求应用date_格式进行转换


  • >选择日期格式(to_timestamp(timestamp,'yyyy/MM/dd HH:MM:ss'),“yyy-MM dd HH:MM:ss”)作为事件的时间戳

    尝试
    unix_timestamp
    将其转换为时间戳类型:)另请参见。在
    Spark 2.3.2
    emr-5.19.0
    )中,我可以确认转换(时间字符串作为时间戳)工作正常(没有更改时间)假设小数点后有9位数字,我们真的需要指定
    ss.ssssss'Z'
    ?格式字符串可以读取
    “yyyy-MM-dd't'HH:MM:ss.SSSX”
    来解析任何时区,而不仅仅是UTCMy大小写,使用此
    到时间戳(cast(时间戳为字符串),'yyyyymmddhhmmss'))
    输出仅为null,其中作为我的时间戳列的值为
    2019/08/02 15:00:00
    。如果我还遗漏了什么,请告诉我。
    ...
    // You have to create an instance of SparkSession
    sparkSession.sql(sqlStatement); 
    ...