如何使用pyspark创建一个包含许多列和日期数据的数据框?

时间:2019-04-15 07:21:10

标签: python date apache-spark dataframe 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。

所以,我想我需要在这里使用一些迭代。但是我不知道该怎么做。有人可以在这里帮助我吗?

1 个答案:

答案 0 :(得分:1)

您可以使用普通python迭代创建tuples中的(group,date,value)。下面的代码相当通用,适用于几乎所有日期以及要创建的任意多个组。只需更改变量num_of_groupsstart_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

您可以使用datetime Python库在日期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| 
+-----+-----------+-----+
相关问题