【问题标题】:pyspark udf regex_extract - "'NoneType' object has no attribute '_jvm'"pyspark udf regex_extract - “'NoneType' 对象没有属性 '_jvm'”
【发布时间】: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


【解决方案1】:

正如@mkaran 指出的那样,许多 pyspark 函数仅在列级别上工作,因此不适合 UDF 使用。使用有效的 .withColumn 解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多