为什么pyspark中的数据框的最大值不正确?

时间:2017-05-22 06:11:20

标签: dataframe pyspark pyspark-sql

我有一个名为order的数据框,从csv文件加载,而 days_since_prior_order 列有一些空值。

testCompile ('junit:junit:4.12') {
    exclude group: 'org.hamcrest'
}
testCompile ('org.mockito:mockito-core:1.10.19') {
    exclude group: 'org.hamcrest'
}
testCompile 'org.hamcrest:hamcrest-core:1.3'

正如您所看到的,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| +--------+-------+--------+------------+---------+-----------------+----------------------+ 时,结果中的最大值不正确。

spark.sql("select min(days_since_prior_order),  max(days_since_prior_order) from orders where days_since_prior_order <> '' ").show()

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

您需要将列从String转换为数字类型。 做类似的事情:

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

然后你会得到正确的结果。

另一种方法是使用udf(用户定义的函数,但是当我们变得简单时,为什么会复杂化。)