Pyspark 火花:指望一个毫秒不工作的窗口

Pyspark 火花:指望一个毫秒不工作的窗口,pyspark,timestamp,apache-spark-sql,windowing,Pyspark,Timestamp,Apache Spark Sql,Windowing,您可以创建一个窗口来计算记录在过去7天内发生的次数。但是,如果您试图查看记录在毫秒级上出现的次数,它就会崩溃 简而言之,下面的函数df.timestamp.astype('timestamp').cast(“long”)仅将时间戳转换为一秒到一秒的长度。它忽略毫秒。如何将整个时间戳(包括毫秒)转换为长时间戳。您需要将该值设置为long,这样它才能与窗口一起工作 从pyspark.sql导入窗口 从pyspark.sql导入函数为F 从pyspark.sql.functions导入unix\u时间

您可以创建一个窗口来计算记录在过去7天内发生的次数。但是,如果您试图查看记录在毫秒级上出现的次数,它就会崩溃

简而言之,下面的函数
df.timestamp.astype('timestamp').cast(“long”)
仅将时间戳转换为一秒到一秒的长度。它忽略毫秒。如何将整个时间戳(包括毫秒)转换为长时间戳。您需要将该值设置为long,这样它才能与窗口一起工作

从pyspark.sql导入窗口
从pyspark.sql导入函数为F
从pyspark.sql.functions导入unix\u时间戳
df=sqlContext.createDataFrame([
(“a”,“u8u”,“2018-02-02 05:46:41.438357”),
(“a”,“u8u”,“2018-02-02 05:46:41.439377”),
(“a”,“a3a”,“2018-02-02 09:48:34.081818”),
(“a”,“a3a”,“2018-02-02 09:48:34.095586”),
(“a”,“g8g”,“2018-02-02 09:48:56.006206”),
(“a”,“g8g”,“2018-02-02 09:48:56.007974”),
(“a”,“9k9”,“2018-02-02 12:50:48.000000”),
(“a”,“9k9”,“2018-02-02 12:50:48.100000”),
],[“个人id”、“会话id”、“时间戳”])
df=df.withColumn('unix_ts',df.timestamp.astype('timestamp').cast(“long”))
df=df.withColumn(“DayOfWeek”,F.date_格式(df.timestamp,'EEEE'))
w=Window.partitionBy('person\u id','DayOfWeek')。orderBy('unix\u ts')。范围介于(-86400*7,-1)之间
df=df.withColumn('count',F.count('unix_ts')。超过(w))
sort(df.unix_ts).show(20,False)
+---------+----------+--------------------------+----------+---------+-----+
|人员id |会话id |时间戳| unix |工作日|计数|
+---------+----------+--------------------------+----------+---------+-----+
|a | u8u | 2018-02-02 05:46:41.438357 | 1517572001 |周五| 0|
|a | u8u | 2018-02-02 05:46:41.439377 | 1517572001 |周五| 0|
|a | a3a | 2018-02-02 09:48:34.081818 | 1517586514 |星期五| 2|
|a | a3a | 2018-02-02 09:48:34.095586 | 1517586514 |星期五| 2|
|a | g8g | 2018-02-02 09:48:56.006206 | 1517586536 |星期五| 4|
|a | g8g | 2018-02-02 09:48:56.007974 | 1517586536 |星期五| 4|
|a | 9k9 | 2018-02-02 12:50:48.000000 | 1517597448 |星期五| 6|
|a | 9k9 | 2018-02-02 12:50:48.100000 | 1517597448 |星期五| 6|
+---------+----------+--------------------------+----------+---------+-----+
计数应为0,1,2,3,4,5。。。您可以使用来将字符串列转换为时间戳,而不是转换为长字符串,而不是0,0,2,2,4,4,…

导入pyspark.sql.F函数
选择(
“时间戳”,
F.unix_时间戳(F.col(“时间戳”),“yyyy-MM-dd-HH:MM:ss.SSSSSS”)。别名(“unix_-ts”)
).show(truncate=False)
#+--------------------------+----------+
#|时间戳| unix|ts|
#+--------------------------+----------+
#|2018-02-02 05:46:41.438357|1517568839|
#|2018-02-02 05:46:41.439377|1517568840|
#|2018-02-02 09:48:34.081818|1517582995|
#|2018-02-02 09:48:34.095586|1517583009|
#|2018-02-02 09:48:56.006206|1517582942|
#|2018-02-02 09:48:56.007974|1517582943|
#|2018-02-02 12:50:48.862644|1517594710|
#|2018-02-02 12:50:49.981848|1517594830|
#+--------------------------+----------+
unix\u timestamp()
的第二个参数是格式字符串。在您的情况下,请使用
“yyyy-MM-dd HH:MM:ss.SSSSSS”


应用于代码的相应更改为:

df=df.withColumn(
“unix_ts”,
F.unix_时间戳(F.col(“时间戳”),“yyyy-MM-dd-HH:MM:ss.ssss”)
)
df=df.withColumn(“DayOfWeek”,F.date_格式(df.timestamp,'EEEE'))
w=Window.partitionBy('person\u id','DayOfWeek')。orderBy('unix\u ts')。范围介于(-86400*7,-1)之间
df=df.withColumn('count',F.count('unix_ts')。超过(w))
sort(df.unix_ts).show(20,False)
#+---------+----------+--------------------------+----------+---------+-----+
#|人员id |会话id |时间戳| unix |工作日|计数|
#+---------+----------+--------------------------+----------+---------+-----+
#|a | u8u | 2018-02-02 05:46:41.438357 | 1517568839 |周五| 0|
#|a | u8u | 2018-02-02 05:46:41.439377 | 1517568840 |星期五| 1|
#|a | g8g | 2018-02-02 09:48:56.006206 | 1517582942 |星期五| 2|
#|a | g8g | 2018-02-02 09:48:56.007974 | 1517582943 |星期五| 3|
#|a | a3a | 2018-02-02 09:48:34.081818 | 1517582995 |星期五| 4|
#|a | a3a | 2018-02-02 09:48:34.095586 | 1517583009 |周五| 5|
#|a | 9k9 | 2018-02-02 12:50:48.862644 | 1517594710 |星期五| 6|
#|a | 9k9 | 2018-02-02 12:50:49.981848 | 1517594830 |星期五| 7|
#+---------+----------+--------------------------+----------+---------+-----+

这样更好,但我认为它仍然存在时间更短的问题。例如,将最后两行替换为这两行,它将是6,6,而不是6,7(“a”、“9k9”、“2018-02-02 12:50:48.000000”)、(“a”、“9k9”、“2018-02-02 12:50:48.000001”)、@MicahPearce您可以在窗口函数中
orderBy('Timestamp')
获得所需的顺序。当您按“Timestamp”排序时,窗口函数不起作用。它错误地指出ORDERBY子句需要是一个数字类型。这是可行的,但是您失去了7天的回顾,这一点很重要。现在,你帮我得到了一个精确到.001的范围,这比我以前得到的要好。我必须看看这是否足够好。