首页 > 解决方案 > 如何使用 pyspark 创建一个包含大量列和日期数据的数据框?

问题描述

我们在使用pyspark创建数据框的时候,通常是这样使用的:

myItems=spark.createDataFrame([(1,'a'),
                               (2,'c')],
                              ['id','item']) 

每一行都是数据框中的一行。但在这里,我需要创建一个数据框,包括 4 个组和日期。例如:

myItems=spark.createDataFrame([(1,2019-01-01',0),
                               (1,2019-01-02',0),
                               ......
                               (1,2019-01-31',0),
                               (2,'2019-01-01',0),
                               ......
                               (2,'2019-01-31',0),
                               data about group 3,
                               data about group 4],
                              ['group','date','value']) 

我需要生成 4 个组:1、2、3、4。对于每个组,都有一个从 2019-01-01 到 2019-01-31 的日期列。值全部为 0。

所以,我想我需要在这里使用一些迭代。我该怎么做?

标签: pythondateapache-sparkdataframepyspark

解决方案


您可以使用普通 python 迭代创建tuples(group,date,value)下面的代码相当通用,几乎适用于所有日期和您想要创建的任意数量的组。只需更改变量num_of_groups,以符合您的要求start_dateend_date

# Number of groups you want to create, starting with 1.
num_of_groups=4    

# Requisite packages to import for doing the iteration on the dates.    
from datetime import date, timedelta

# Initialize start and end date.
start_date = date(2019, 1, 1)
end_Date = date(2019, 1, 31)
delta = end_Date - start_date

您可以使用datetimePython 库来获取日期中的日期format,您可以在该日期上进行迭代以获取连续日期并最终用于将日期strftime转换date为所需的string格式。

# This will store the list of consecutive dates from start to end date.
list_dates=[]    
for i in range(delta.days + 1):
   list_dates = list_dates + [(start_date + timedelta(i)).strftime("%d-%m-%Y")]
print(list_dates)
   ['01-01-2019','02-01-2019','03-01-2019',.....'29-01-2019','30-01-2019','31-01-2019']

使用嵌套list comprehensions来创建上面提到的元组列表。

myValues=[(group,date,0) for group in range(1,num_of_groups+1) for date in list_dates]
print(myValues)
   [(1, '01-01-2019', 0), (1, '02-01-2019', 0), ... (4, '30-01-2019', 0), (4, '31-01-2019', 0)]

最后,创建 DataFrame。

myItems=spark.createDataFrame(myValues,['group','date','value']) 
myItems.show(200)
+-----+-----------+-----+ 
|group|       date|value| 
+-----+----------+------+ 
|    1| 01-01-2019|    0| 
|    1| 02-01-2019|    0| 
|    1| 03-01-2019|    0| 
|    1| 04-01-2019|    0| 
|    1| 05-01-2019|    0|
.
.
.

|    4| 28-01-2019|    0| 
|    4| 29-01-2019|    0| 
|    4| 30-01-2019|    0| 
|    4| 31-01-2019|    0| 
+-----+-----------+-----+

推荐阅读