透视缺失值

时间:2016-10-02 14:28:28

标签: python-2.7 apache-spark pivot pyspark

我有DataFrame个简单schema

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'已解决的属性#3972缺少   日#5367,小时#5354,总和(金额)#5437 in operator!Aggregate   [dayofyear(演员(日期#3972为日期))],[dayofyear(演员)(日期#3972 as   日期))AS日#5367,pivotfirst(小时#5354,总和(金额)#5437,0,1,2,   3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,   22,23,0,0)AS __pivot_sum(金额)AS总和(金额)#5487];'

1 个答案:

答案 0 :(得分: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的{​​{1}}参数是可选的,但是可取的。