2016-10-02 64 views
1

我有以下简单schema一个DataFrame枢转缺失值

root 
|-- amount: double (nullable = true) 
|-- Date: timestamp (nullable = true) 

我想看看每天,每小时金额的sum,有的像:

+---+--------+--------+ ... +--------+ 
|day|  0|  1|  |  23| 
+---+--------+--------+ ... +--------+ 
|148| 306.0| 106.0|  |  0.0| 
|243| 1906.0| 50.0|  |  1.0| 
| 31| 866.0| 100.0|  |  0.0| 
+---+--------+--------+ ... +--------+ 

好,首先我添加了一列hour,然后按天分组,然后按小时旋转。但是,我得到了一个例外,这可能与几个小时的销售缺失有关。这正是我想要解决的问题,但我还没有意识到如何。

(df.withColumn("hour", hour("date")) 
    .groupBy(dayofyear("date").alias("day")) 
    .pivot("hour") 
    .sum("amount").show()) 

该异常的摘录。

AnalysisException:u'resolved属性(S)日期#3972从 天#5367,#小时5354,总和(金额)在操作#5437缺少骨料 [DAYOFYEAR(CAST(日期#3972的最新消息! ))],[dayofyear(cast(date#3972 as date))AS day#5367,pivotfirst(hour#5354,sum(amount)#5437,0,1,2, 3,4,5,6, (金额)AS总和(金额)#金额(金额)#金额(金额)#金额(金额)#金额5487];”

回答

2

问题未解决day列。您可以在外面创建groupBy子句来解决:

df = (sc 
     .parallelize([ 
      (1.0, "2016-03-30 01:00:00"), (30.2, "2015-01-02 03:00:02")]) 
     .toDF(["amount", "Date"]) 
     .withColumn("Date", col("Date").cast("timestamp")) 
     .withColumn("hour", hour("date"))) 

with_day = df.withColumn("day", dayofyear("Date")) 
with_day.groupBy("day").pivot("hour", range(0, 24)).sum("amount") 

values论据pivot是可选的,但建议。