2017-05-22 33 views
0

我有一個datafram命名爲訂單,從csv文件加載,而days_since_prior_order列有一些空白值。爲什麼pyspark中的datafram的最大值不正確?

orders = spark.read.csv("/Users/yanan.chen/Downloads/instacart/orders.csv",header=True) 
orders.createOrReplaceTempView("orders") 
spark.sql("select * from orders limit 30").show() 

+--------+-------+--------+------------+---------+-----------------+----------------------+ 
|order_id|user_id|eval_set|order_number|order_dow|order_hour_of_day|days_since_prior_order| 
+--------+-------+--------+------------+---------+-----------------+----------------------+ 
| 2539329|  1| prior|   1|  2|    08|      | 
| 2398795|  1| prior|   2|  3|    07|     15.0| 
| 473747|  1| prior|   3|  3|    12|     21.0| 
| 2254736|  1| prior|   4|  4|    07|     29.0| 
| 431534|  1| prior|   5|  4|    15|     28.0| 
| 3367565|  1| prior|   6|  2|    07|     19.0| 
| 550135|  1| prior|   7|  1|    09|     20.0| 
| 3108588|  1| prior|   8|  1|    14|     14.0| 
| 2295261|  1| prior|   9|  1|    16|     0.0| 
| 2550362|  1| prior|   10|  4|    08|     30.0| 
| 1187899|  1| train|   11|  4|    08|     14.0| 
| 2168274|  2| prior|   1|  2|    11|      | 
| 1501582|  2| prior|   2|  5|    10|     10.0| 
| 1901567|  2| prior|   3|  1|    10|     3.0| 
| 738281|  2| prior|   4|  2|    10|     8.0| 
| 1673511|  2| prior|   5|  3|    11|     8.0| 
| 1199898|  2| prior|   6|  2|    09|     13.0| 
| 3194192|  2| prior|   7|  2|    12|     14.0| 
| 788338|  2| prior|   8|  1|    15|     27.0| 
| 1718559|  2| prior|   9|  2|    09|     8.0| 
+--------+-------+--------+------------+---------+-----------------+----------------------+ 

正如你所看到的,days_since_prior_order中有一些空白,其實就是''。 spark.sql("select * from orders where days_since_prior_order <> '' ").show()

+--------+-------+--------+------------+---------+-----------------+----------------------+ 
|order_id|user_id|eval_set|order_number|order_dow|order_hour_of_day|days_since_prior_order| 
+--------+-------+--------+------------+---------+-----------------+----------------------+ 
| 2398795|  1| prior|   2|  3|    07|     15.0| 
| 473747|  1| prior|   3|  3|    12|     21.0| 
| 2254736|  1| prior|   4|  4|    07|     29.0| 
| 431534|  1| prior|   5|  4|    15|     28.0| 
| 3367565|  1| prior|   6|  2|    07|     19.0| 
| 550135|  1| prior|   7|  1|    09|     20.0| 
| 3108588|  1| prior|   8|  1|    14|     14.0| 
| 2295261|  1| prior|   9|  1|    16|     0.0| 
| 2550362|  1| prior|   10|  4|    08|     30.0| 
| 1187899|  1| train|   11|  4|    08|     14.0| 
| 1501582|  2| prior|   2|  5|    10|     10.0| 
| 1901567|  2| prior|   3|  1|    10|     3.0| 
| 738281|  2| prior|   4|  2|    10|     8.0| 
| 1673511|  2| prior|   5|  3|    11|     8.0| 
| 1199898|  2| prior|   6|  2|    09|     13.0| 
| 3194192|  2| prior|   7|  2|    12|     14.0| 
| 788338|  2| prior|   8|  1|    15|     27.0| 
| 1718559|  2| prior|   9|  2|    09|     8.0| 
| 1447487|  2| prior|   10|  1|    11|     6.0| 
| 1402090|  2| prior|   11|  1|    10|     30.0| 
+--------+-------+--------+------------+---------+-----------------+----------------------+ 

但是,是什麼讓我感到困惑的是,當我EXCUTE spark.sql("select min(days_since_prior_order), max(days_since_prior_order) from orders where days_since_prior_order <> '' ").show()中產生的最大值是不正確的。

+---------------------------+---------------------------+ 
|min(days_since_prior_order)|max(days_since_prior_order)| 
+---------------------------+---------------------------+ 
|      0.0|      9.0| 
+---------------------------+---------------------------+ 

我的代碼有什麼問題?

+0

所有字段的類型是字符串。 – yanachen

+1

'9.0'> '30 .0'字符串類型 –

回答

1

您需要將字符串的列轉換爲數字類型。 這樣做:

from pyspark.sql.functions import col 
orders = orders.withColumn('days_since_prior_order', 
     col('days_since_prior_order').cast('double')) 

然後你會得到正確的結果。

另一種方法是使用UDF(用戶自定義函數,但是當我們進行簡單的原因複雜。)

+0

您是否知道如何以days_since_prior_order的順序顯示訂單df,該訂單已被轉換爲整數?我只是顯示()它買10是在2的前面,而10是在1之後。 – yanachen

+0

不知道我很好理解你的問題,但是如果你想要值的順序,你可以通過做df.groupBy('days_since_prior_order' ).Count之間的()。節目() –

相關問題