aws glue pypark udf抛出错误调用o104.showstring时出错回溯(最近一次呼叫)

igsr9ssn  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(336)

我需要得到一个预期的Dataframe在aws胶水使用pyspark显示在最后


################# Initial Dataframe#################

    +---+--------------------+-------------------+
    |_c0|                 _c1|               time|
    +---+--------------------+-------------------+
    |  1|                null|2020-05-30 19:36:32|
    |  2|Mobii5              |2020-05-30 19:36:32|
    |  3|Nooft biHi ooFrame 2|2020-05-30 19:36:32|
    |  4|Samsung mobile   ...|2020-05-30 19:36:32|
    |  5|Samsung ppjomes  ...|2020-05-30 19:36:32|
    |  6| samsung GTP G Tv ne|2020-05-30 19:36:32|
    |  7| all mightyPanasoci |2020-05-30 19:36:32|
    |  8|Samsung hola       .|2020-05-30 19:36:32|
    |  9|Mooron phoines Mondo|2020-05-30 19:36:32|
    | 10|Samsung Guru .......|2020-05-30 19:36:32|
    +---+--------------------+-------------------+

下面是我的代码

time_udf = udf(lambda x: year(x), IntegerType())

    timestamp = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
                new_df = df.withColumn('time',unix_timestamp(lit(timestamp),'yyyy-MM-dd HH:mm:ss').cast("timestamp"))
                print(new_df.show(10))
                time.sleep(30)
    df1 = new_df.withColumn('Year',time_udf(col("time")))
    df1.createOrReplaceTempView("people")
                sqlDF = spark.sql("SELECT * FROM people")
                sqlDF.show()
                print(df1.printSchema())
                return(df1)

需要使用aws-udf-pyspark获得如上所示的输出


############### Expected###################

    +---+--------------------+-------------------+----+
    |_c0|                 _c1|               time|Year|
    +---+--------------------+-------------------+----+
    |  1|                null|2020-05-29 20:07:58|2020|
    |  2|Mobiistar Prime 5...|2020-05-29 20:07:58|2020|
    |  3|NTT Hikari i-Frame 2|2020-05-29 20:07:58|2020|
    |  4|Samsung SM-P605K ...|2020-05-29 20:07:58|2020|
    |  5|Samsung SM-G850W ...|2020-05-29 20:07:58|2020|
    |  6|samsung GTP G Tv ne |2020-05-29 20:07:58|2020|
    |  7|all mightyPanasoci  |2020-05-29 20:07:58|2020|
    |  8|Samsung hola       .|2020-05-29 20:07:58|2020|
    |  9|Mooron phoines Mondo|2020-05-29 20:07:58|2020|
    | 10|Samsung Guru .......|2020-05-29 20:07:58|2020|
    +---+--------------------+-------------------+----+

我可以用下面这条线把它弄好

df1 = new_df.withColumn('Year',year(new_df.time))

但我需要使用自定义项作为要求

vlju58qv

vlju58qv1#

你不能使用 year 在udf内部,因为它是pyspark函数。
如果真的需要使用自定义项,可以使用常用的python日期时间函数:

from datetime import datetime

def extractYear(datestring):
   dt = datetime.strptime(datestring, '%Y-%m-%d %H:%M:%S')
   return dt.year

time_udf = udf(lambda x: extractYear(x), IntegerType())

但是使用 year ,就像在 .withColumn('Year',year(new_df.time)) 会更简单,更快,所以如果它有效-最好坚持下去。

相关问题