我有一个名为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()
我的代码出了什么问题?
答案 0 :(得分:1)
您需要将列从String转换为数字类型。 做类似的事情:
from pyspark.sql.functions import col
orders = orders.withColumn('days_since_prior_order',
col('days_since_prior_order').cast('double'))
然后你会得到正确的结果。
另一种方法是使用udf(用户定义的函数,但是当我们变得简单时,为什么会复杂化。)