Python ZoneInfo在pyspark UDF中不工作

h7appiyu  于 2023-10-15  发布在  Spark
关注(0)|答案(1)|浏览(130)

嗨Maven,我被一个问题卡住了,如果我使用ZoneInfo从python zoneinfo包的日期得到预期的转换,但是,当我使用相同的代码下Sparkudf它抛出错误“没有时区发现关键欧洲/布鲁塞尔”.请帮帮我。下面是代码:

工作python代码:

  1. from zoneinfo import ZoneInfo
  2. conv_dt = datetime.strptime('2038.01.09 00:00:00', '%Y.%m.%d %H%M%S').astimezone(ZoneInfo('Europe/Brussels'))

SPARK自定义项下的代码相同,无法工作创建框架:

  1. sample_df = spark.createDataFrame(['2038.01.09 00:00:00'], StringType()).toDF('sampledate')

udf声明:

  1. def test_udf(sd):
  2. return datetime.strptime(sd, '%Y.%m.%d %H%M%S').astimezone(ZoneInfo('Europe/Brussels'))

调用udf:

  1. x = udf(test_udf, TimeStamp())
  2. cast_df = sample_df.withColumns('sampledate',x(sample_df['sampledate']))
  3. cast_df.show()

错误:File“...lib/python3.9/zoneinfo/_common.py”,line 24 in load_tzdata raise
ZoneInfoNotFoundError:“No timezone found with key Europe/布鲁塞尔”
谢谢你,谢谢

wn9m85ua

wn9m85ua1#

您面临的问题可能与Spark UDF与zoneinfo等外部Python包的工作方式有关。当您在Spark UDF中使用zoneinfo时,它需要对Spark worker可用。对于故障排除,以下是解决问题的一些步骤:
1.确保所有Spark worker节点上都安装了zoneinfo包。你可以使用pip或软件包管理器来安装它。您可能需要管理访问权限才能在工作节点上安装包。
1.确保zoneinfo包可以在Spark UDF中导入。为此,您可以在UDF函数的开头包含ZoneInfo的import语句。
您可以通过以下方式执行此操作:

  1. from pyspark.sql import SparkSession
  2. from pyspark.sql.functions import udf
  3. from pyspark.sql.types import StringType, TimestampType
  4. from zoneinfo import ZoneInfo
  5. from datetime import datetime
  6. spark = SparkSession.builder.appName("ZoneInfoExample").getOrCreate()
  7. def test_udf(sd):
  8. from zoneinfo import ZoneInfo # Import ZoneInfo within the UDF
  9. return datetime.strptime(sd, '%Y.%m.%d %H%M%S').astimezone(ZoneInfo('Europe/Brussels'))
  10. x = udf(test_udf, TimestampType())
  11. sample_df = spark.createDataFrame(['2038.01.09 00:00:00'], StringType()).toDF('sampledate')
  12. cast_df = sample_df.withColumn('sampledate', x(sample_df['sampledate']))
  13. cast_df.show()
展开查看全部

相关问题