Apache spark Spark数据帧复序

Apache spark Spark数据帧复序,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个事件日志数据集,如下所示: | patient | timestamp | event_st | extra_info | | 1 | 1/1/2018 2:30 | urg_admission | x | | 1 | 1/1/2018 3:00 | urg_discharge | x | | 1 | 1/1/2018 | hosp_admission | y |

我有一个事件日志数据集,如下所示:

| patient | timestamp     | event_st       | extra_info |
| 1       | 1/1/2018 2:30 | urg_admission  | x          |
| 1       | 1/1/2018 3:00 | urg_discharge  | x          |
| 1       | 1/1/2018      | hosp_admission | y          |
| 1       | 1/10/2018     | hosp_discharge | y          | 
我想按
患者
时间戳
对所有行进行排序,但不幸的是,根据事件的类型,
时间戳
可能以分钟或天为单位


<> P> >,我在C++中使用的解决方案是定义一个复数<代码> > P>一个选项是首先将所有的时间戳归一化到一些标准形式,如DDMMY或在时代。最简单的方法是使用udf

例如:如果你认为所有的时间戳都要转换成EnCH,那么你的代码看起来像:

def convertTimestamp(timeStamp:String, event_st:String) : Long = {
    if(event_st == 'urg_admission') {
    ...// Add conversion logic
    }
    if(event_st == 'hosp_admission') {
    ...// Add conversion logic
    }
     ...
}

val df = spark.read.json("/path/to/log/dataset") // I am assuming json format
spark.register.udf("convertTimestamp", convertTimestamp _)
df.createOrReplaceTempTable("logdataset")
val df_normalized = spark.sql("select logdataset.*, convertTimestamp(timestamp,event_st) as normalized_timestamp from logdataset")

在此之后,您可以从后续操作中使用规范化数据集。

在这种情况下,是否可以按3列对数据进行排序?首先是患者,然后是事件,最后是时间戳?或者你有更多的事件类型?(在这种情况下,您可以考虑添加一个具有两个值的新列,而不是<代码> EngestSt< /COD>)。Hi @ Shaido。谢谢你的评论。我添加了一个
event\u order
数字列,它是对
event\u st
的重新编码,在这里我强制执行语义顺序,然后我设置了您建议的三列顺序。这似乎有效,但我觉得这是一个局部解决方案…谢谢你的答复。不幸的是,比较有点复杂,因为时间粒度是可变的:
hosp
事件具有日粒度,
urg
事件具有分钟粒度。我知道,如果事件发生在同一天,
hosp
事件应该在
urg
事件之后排序,因此需要进行复杂的比较。