创建一个将时间转换为二进制响应变量的函数

时间:2016-11-09 16:32:32

标签: apache-spark pyspark apache-spark-sql apache-spark-mllib decision-tree

我目前有一个RDD,其中有两列是

<script>
$(document).ready(function() {
  $("#loading").fadeOut(200);
  $("#divtoshow").fadeIn(200);
});
</script>

我想将它们转换为二进制响应变量,其中1表示夜间时间,0表示白天时间。

我知道我们可以使用Row(pickup_time=datetime.datetime(2014, 2, 9, 14, 51) dropoff_time=datetime.datetime(2014, 2, 9, 14, 58) 创建一个函数,将其更改为所需的格式。

例如我有另一列是一个字符串,它将付款类型指定为'CSH'或'CRD',所以我能够解决这个问题

UserDefinedFunction

我如何对我提出的问题应用同样的逻辑?如果它有助于我尝试转换这些变量,因为我将运行决策树。

1 个答案:

答案 0 :(得分:1)

这里不需要UDF。您可以使用between并输入信息:

from pyspark.sql.functions import hour

def in_range(colname, lower_bound=6, upper_bound=17):
    """
    :param colname - Input column name (str)
    :lower_bound   - Lower bound for day hour (int, 0-23) 
    :upper_bound   - Upper bound for day hour (int, 0-23)
    """
    assert 0 <= lower_bound <= 23
    assert 0 <= upper_bound <= 23

    if lower_bound < upper_bound:
        return hour(colname).between(lower_bound, upper_bound).cast("integer")
    else:
        return (
            (hour(colname) >= lower_bound) |
            (hour(colname) <= upper_bound)
        ).cast("integer")

使用示例:

df = sc.parallelize([
    Row(
        pickup_time=datetime.datetime(2014, 2, 9, 14, 51), 
        dropoff_time=datetime.datetime(2014, 2, 9, 14, 58)
    ),
    Row(
        pickup_time=datetime.datetime(2014, 2, 9, 19, 51), 
        dropoff_time=datetime.datetime(2014, 2, 9, 1, 58)
    )
]).toDF()

(df
    .withColumn("dropoff_during_day", in_range("dropoff_time"))
    # between 6pm and 5am
    .withColumn("pickpup_during_night", in_range("pickup_time", 18, 5)))
+--------------------+--------------------+------------------+--------------------+
|        dropoff_time|         pickup_time|dropoff_during_day|pickpup_during_night|
+--------------------+--------------------+------------------+--------------------+
|2014-02-09 14:58:...|2014-02-09 14:51:...|                 1|                   0|
|2014-02-09 01:58:...|2014-02-09 19:51:...|                 0|                   1|
+--------------------+--------------------+------------------+--------------------+