python - Pyspark 为包含时间范围的记录创建多行
问题描述
我有一个数据框看起来像这样。
A Start End
1 1578 1581
1 1789 1790
2 1800 1802
开始和结束是纪元。我想每秒钟创建多行,就像这样
A time
1 1578
1 1579
1 1580
1 1581
1 1789
1 1790
2 1800
2 1801
2 1802
如何在pyspark中做到这一点?(不需要保持顺序)
谢谢!
解决方案
这个想法是通过包含中间体来创建一个list
包含整个时间跨度的seconds
. 例如;对于Start = 1578
and End = 1581
,我们创建一个列表[1578,1579,1580,1581]
。要创建此列表,我们首先创建一个UDF
. 获得此列表后,我们将其分解以获取所需的dataframe
.
# Creating the DataFrame
values = [(1,1578,1581),(1,1789,1790),(2,1800,1802)]
df = sqlContext.createDataFrame(values,['A','Start','End'])
df.show()
+---+-----+----+
| A|Start| End|
+---+-----+----+
| 1| 1578|1581|
| 1| 1789|1790|
| 2| 1800|1802|
+---+-----+----+
# Import requisite packages
from pyspark.sql.functions import udf, col, explode, array, struct
from pyspark.sql.types import ArrayType, StructType, StructField, IntegerType
#Creating UDFs below to create a list.
def make_list(start,end):
return list(range(start,end+1))
make_list_udf = udf(make_list,ArrayType(IntegerType()))
#Creating Lists of seconds finally.
df = df.withColumn('my_list',make_list_udf(col('Start'),col('End'))).drop('Start','End')
df.show(truncate=False)
+---+------------------------+
|A |my_list |
+---+------------------------+
|1 |[1578, 1579, 1580, 1581]|
|1 |[1789, 1790] |
|2 |[1800, 1801, 1802] |
+---+------------------------+
#Exploding the Lists
df = df.withColumn('time', explode('my_list')).drop('my_list')
df.show()
+---+----+
| A|time|
+---+----+
| 1|1578|
| 1|1579|
| 1|1580|
| 1|1581|
| 1|1789|
| 1|1790|
| 2|1800|
| 2|1801|
| 2|1802|
+---+----+
推荐阅读
- mysql - 两个表之间的许多关系 - 代码优先
- c# - C# - 通过创建日期和 UNIX Cron 表达式获取上次作业执行的日期
- google-data-studio - Vega-Lite 中用于甘特图的滚动条 - Data Studio
- javascript - 混合 Node 的 CommonJS 和 Typescript 的 ES 模块
- redis - AWS Redis 集群模式 - 自动故障转移和多可用区标志有什么区别?
- r - 例如:计算当 x[i]>0 时为真的逻辑向量
- r - 如果闪亮的应用程序用户想要不同的方式来选择人员级别的数据进行可视化,多个“选择”控件小部件如何同步在一起?
- dotnetnuke - DNN Cookie 弹出窗口未显示 - 无法读取未定义的属性(读取“getVAR”)
- c# - 我收到以下错误:在模型中将公共字符串更改为公共动态后,“表达式树可能不包含动态操作”
- node.js - 如何使用 Mongoose 和 Nodehs 更新 MongoDB 中的字段列表?