【发布时间】:2018-02-07 10:57:50
【问题描述】:
我在 pyspark 中遇到了一个非常奇怪的问题。我正在使用正则表达式从冗长的日期时间字符串中提取 unixtimestamp(存储的字符串不适合直接转换)。将其写入 withColumn 函数时效果很好:
r= "([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2})\.([0-9]*)"
latencyhops.select('time') \
.withColumn('TimeSec',f.unix_timestamp(f.regexp_extract('time', r, 1))) \
.show(5,False)
+---------------------------+----------+
|time |TimeSec |
+---------------------------+----------+
|2018-01-22 14:39:00.0743640|1516631940|
|2018-01-23 05:47:34.2797780|1516686454|
|2018-01-23 05:47:34.2797780|1516686454|
|2018-01-23 05:47:34.2797780|1516686454|
|2018-01-24 08:06:29.2989410|1516781189|
但是,当通过 UDF 运行时,它会失败:
from pyspark.sql.functions import udf
from pyspark.sql.types import *
def timeConversion (time):
return f.unix_timestamp(f.regexp_extract(time, "([0-9]{4}-[0-9]{2}-
[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2})\.([0-9]*)", 1))
to_nano =udf(timeConversion, IntegerType())
latencyhops.select('time') \
.withColumn('TimeSec',to_nano('time', r, 1)) \
.show(5,False)
与:
..../pyspark/sql/functions.py", line 1521, in regexp_extract
jc = sc._jvm.functions.regexp_extract(_to_java_column(str), pattern, idx)
AttributeError: 'NoneType' object has no attribute '_jvm'
据我所知,这些应该做完全相同的事情。我尝试了多种定义 UDF(lambda 表达式等)的变体,但总是遇到相同的错误。有人给点建议吗?
谢谢
【问题讨论】:
-
在您需要调用 udf 而不是函数的代码中。您正在调用 timeConversion('time', r, 1)) 而它应该是 to_nano
-
另外,
unix_timestamp和其他 pyspark 函数在列级别上工作,它们不会在 udf 内工作。 -
@pratiklodha - 抱歉,这是更改函数名称的产物。我用 to_nano 试过了。
-
@mkaran - 听起来这就是原因!谢谢,我不知道
-
@AMcNall 很高兴你解决了它! :)
标签: python-3.x pyspark apache-spark-sql pyspark-sql