2016-10-02 87 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是可選的,但建議。