【问题标题】:using numpy busday_count function in pyspark在 pyspark 中使用 numpy busday_count 函数
【发布时间】:2020-03-27 18:05:40
【问题描述】:

鉴于我在 pyspark 中有两列不为空:

df2 = sqlContext.sql("SELECT AssignedDate,primaryid from parts_so where AssignedDate is not null ")
df2 = df2.withColumn('sdate', df2.AssignedDate )
df2 = df2.withColumn('edate',current_timestamp() )

当我运行df2 = df2.withColumn('days_outstanding', lit(get_hours2(df2.sdate,df2.edate ) )

def get_hours2(sdate,edate):

    biz_days = np.busday_count(sdate,edate)

    return biz_days

我收到以下错误:

object of type 'Column' has no len()

【问题讨论】:

  • numpy.busday_count 需要输入数组。我认为您的日期列不是数组。如果它是一个数组,则必须对其进行迭代.. pyspark 还提供了减去日期的功能。你可以阅读here

标签: numpy pyspark


【解决方案1】:

首先让我们创建一些随机数据

import datetime
import random
import pandas as pd
import numpy as np

sdate = [datetime.datetime.now() + datetime.timedelta(i) for i in range(5)]
edate = [date + datetime.timedelta(random.random()+3) for date in sdate]
data = {
    'sdate': sdate,
    'edate': edate
}
pdf = pd.DataFrame(data)
df = spark.createDataFrame(pdf)
df.show()
+--------------------+--------------------+
|               edate|               sdate|
+--------------------+--------------------+
|2019-12-06 22:55:...|2019-12-03 08:14:...|
|2019-12-07 19:42:...|2019-12-04 08:14:...|
|2019-12-08 21:26:...|2019-12-05 08:14:...|
|2019-12-09 18:57:...|2019-12-06 08:14:...|
|2019-12-11 04:08:...|2019-12-07 08:14:...|
+--------------------+--------------------+

您不能使用裸函数在 pyspark 中创建另一列。为此,我们必须创建 UDF。

注意:请记住,您必须将计算结果转换为 int,因为您可能会遇到酸洗 numpy 类型的问题。

import pyspark.sql.types as T
import pyspark.sql.functions as F

@F.udf(returnType=T.IntegerType())
def get_hours2(sdate,edate):
    biz_days = np.busday_count(sdate,edate)
    return int(biz_days)

最后我们可以在创建的 DataFrame 上使用 UDF。

df = df.withColumn('days_outstanding', F.lit(get_hours2('sdate', 'edate')))
df.show()
+--------------------+--------------------+----------------+
|               edate|               sdate|days_outstanding|
+--------------------+--------------------+----------------+
|2019-12-06 22:55:...|2019-12-03 08:14:...|               3|
|2019-12-07 19:42:...|2019-12-04 08:14:...|               3|
|2019-12-08 21:26:...|2019-12-05 08:14:...|               2|
|2019-12-09 18:57:...|2019-12-06 08:14:...|               1|
|2019-12-11 04:08:...|2019-12-07 08:14:...|               2|
+--------------------+--------------------+----------------+

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多