Pyspark UDF无法正常工作,期望字符串不为列

时间:2019-01-30 20:35:30

标签: python datetime pyspark user-defined-functions

我编写了一个UDF函数,该函数接受一列,然后将该字符串解析为该列中所有值的日期时间格式的字符串。

但是,当我运行spark作业时,我的函数抛出了以下错误:

strptime() argument 1 must be string, not Column
Here is my UDF and python function

dateformat = udf(lambda x: datetimeformat(x), StringType())

def datetimeformat(x):
   return datetime.strptime(x, '%Y%m%d %H:%M:%S.%f').strftime('%Y-%m-%d %H:%M:%S.%f')

How the udf is called

newdf=newdf.withColumn("date",dateformat(newdf["date"]))



2 个答案:

答案 0 :(得分:0)

我无法测试,因为我没有可用的Spark环境,但是我认为您只需要写列名而不是列对象即可

newdf=newdf.withColumn("date",dateformat("date"))

答案 1 :(得分:0)

没有对newdf的可见性。我创建了如下的临时数据集

c:\ tmp \ f4.csv


dt
20180212 15:10:10.000
20180212 15:10:10.000
20180212 15:10:10.000

代码如下:

from pyspark.sql.functions import *
from pyspark.sql.types import *
from datetime import datetime
schema=StructType([StructField("dt",StringType())])
f1=spark.read.format("csv").schema(schema).option("header","true").option("delimiter","|").load("c:/tmp/f4.csv")
dateformat = udf(lambda x: datetimeformat(x), StringType())
def datetimeformat(x):
   return datetime.strptime(x, '%Y%m%d %H:%M:%S.%f').strftime('%Y-%m-%d %H:%M:%S.%f')



f2=f1.withColumn("date",dateformat(f1["dt"]))
f2.show()

输出

+--------------------+--------------------+
|                  dt|                date|
+--------------------+--------------------+
|20180212 15:10:10...|2018-02-12 15:10:...|
|20180212 15:10:10...|2018-02-12 15:10:...|
|20180212 15:10:10...|2018-02-12 15:10:...|
+--------------------+--------------------+