pyspark:无法使用pyspark.sql.functions更改时间戳格式的最细微秒级

时间:2019-02-18 14:17:17

标签: apache-spark pyspark

说我有一个如下数据框(实际数据框的日期列是20列之一,并且数据量很大。 我在这里只考虑带日期列的数据框和带日期单行的产品列)

    df = spark.createDataFrame([('12/21/2015 23:21:20.689523',"product1")], ['dt',"product_name"])

现在我的目标是将时间戳格式更改为“ yyyy / MM / dd HH:mm:ss.SSSSSS”,并另存为同一数据帧中的时间戳列(而不是字符串列) 因此,在这种情况下,我将面临以下问题。

  1. date_format函数不会直接重新格式化格式并返回null

    df.withColumn("new_datetime",date_format("dt","yyyy/MM/dd HH:mm:ss.SSSSSS" ))
    
  2. 现在要克服这个问题,我尝试使用to_timestamp并在其上使用date_format,但是在这里使用to_timestamp只能达到秒级的粒度。由于无法识别,因此无法包含'dt'列中的微秒。 (如果我还包含'.SSSSSS',它将返回null)

    df.withColumn("new_datetime",to_timestamp("dt","MM/dd/yyyy HH:mm:ss"))
    
  3. 现在,作为另一个选择,我试图将列强制转换为“时间戳”,但也以徒然结束

  4. 最后我通过python的datetime模块实现了它

    df = df.withColumn('row_index', monotonically_increasing_id())
    
    def convert_fmt(date_time):
        return datetime.strptime(datetime.strptime(date_time,"%m/%d/%Y %H:%M:%S.%f").strftime("%Y/%m/%d %H:%M:%S.%f"),"%Y/%m/%d %H:%M:%S.%f")
    
    df_new=df.rdd.map(lambda x : (x.asDict()["row_index"],convert_fmt(x.asDict()["dt"]))).toDF(["index","dt_new"])
    df=df_new.join(df,df_new.index==df.row_index).drop("row_index","index","dt")
    

但这是一种间接方法。我想知道,我们如何才能提高粒度的日期列的时间戳格式 到微秒,并使用core-spark API和函数将其保存为时间戳列的数据帧。

0 个答案:

没有答案