apache-spark - Spark Dataframe 复杂排序
问题描述
我有一个事件日志数据集,如下所示:
| 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 |
我想按patient
and对所有行进行排序timestamp
,但不幸的是,根据 event 的类型event_st
,timestamp
可能以分钟或天为单位。
因此,我将在 C++ 中使用的解决方案是定义一个复杂的<
运算符,当时间粒度不同时,我将使用它event_st
作为鉴别器。例如,对于显示的数据,当日期相同时,hosp_
带有前缀的事件将始终排在带有前缀的事件之后urg_
。
是否有使用DataFrame
API 或其他 Spark API 的等效方法?
非常感谢。
解决方案
一种选择是首先将所有时间戳标准化为某种标准形式,如 ddMMYY 或纪元。最简单的方法是使用 udf。
例如:如果您考虑将所有时间戳转换为纪元,那么您的代码将如下所示:
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")
在此之后,您可以使用规范化的数据集形成后续操作。
推荐阅读
- python - 使用命名值通过pyparsing获取字符串中的标记位置
- reactjs - 在 React 中使用惰性和悬念时如何导出加载状态?
- javascript - 为输入复选框触发 change() 事件不会触发所有事件处理程序
- php - 在php中获得多卷曲的响应时,如何控制接收数据的顺序?
- r - 使用 R 进行 2D 投影的 3D 表面
- mysql - MySQL 触发器:使用 IF 语句插入新表但出现重复项
- tensorflow - SageMaker:可视化训练统计
- r - r - 创建函数来计算数据集中过滤行的计数
- python - 通过python中的下拉菜单打开文件
- swagger - swagger-codegen 引用了一个不存在的 Java 类