如何在Pyspark中将阿拉伯/乌尔都文日期转换为yyyy-mm-dd格式的英文日期
Pyspark转换阿拉伯/乌尔都文日期为标准格式实现方案
核心逻辑为:先将日期字符串中的东部阿拉伯数字转换为拉丁数字,再按照原日期结构解析为日期类型,最后输出yyyy-mm-dd格式的标准日期。
实现步骤
- 首先构建数字映射关系:乌尔都/阿拉伯文使用的东部阿拉伯数字
٠١٢٣٤٥٦٧٨٩对应拉丁数字0123456789 - 使用Pyspark内置
translate()函数完成数字字符替换,该方案为算子原生实现,性能远高于自定义UDF,适合大数据量场景 - 用
to_date()函数解析转换后的日期字符串,最后通过date_format()输出目标格式
完整代码示例
from pyspark.sql import SparkSession from pyspark.sql.functions import translate, to_date, date_format, col # 初始化Spark会话 spark = SparkSession.builder.appName("ArabicDateConvert").getOrCreate() # 模拟测试数据,你可以替换为读取JSON文件的逻辑 test_data = [("٠٤-٢٥-٢٠٢١",), ("١٢-٠١-٢٠٢٢",), ("٠٧-١٥-٢٠٢٣",)] df = spark.createDataFrame(test_data, ["ar_date_col"]) # 定义字符映射规则 east_arabic_nums = "٠١٢٣٤٥٦٧٨٩" latin_nums = "0123456789" # 执行转换逻辑 df_result = df.withColumn( # 替换东部阿拉伯数字为拉丁数字 "latin_date_str", translate(col("ar_date_col"), east_arabic_nums, latin_nums) ).withColumn( # 按原日期结构解析为日期类型,示例原格式为MM-dd-yyyy,可根据实际结构调整参数 "date_obj", to_date(col("latin_date_str"), "MM-dd-yyyy") ).withColumn( # 输出yyyy-mm-dd格式标准日期 "standard_date", date_format(col("date_obj"), "yyyy-MM-dd") ) # 查看转换结果 df_result.show(truncate=False)
转换结果示例
+-------------+--------------+----------+-------------+ |ar_date_col |latin_date_str|date_obj |standard_date| +-------------+--------------+----------+-------------+ |٠٤-٢٥-٢٠٢١ |04-25-2021 |2021-04-25|2021-04-25 | |١٢-٠١-٢٠٢٢ |12-01-2022 |2022-12-01|2022-12-01 | |٠٧-١٥-٢٠٢٣ |07-15-2023 |2023-07-15|2023-07-15 | +-------------+--------------+----------+-------------+
注意事项
- 如果你的原日期结构不是
MM-dd-yyyy,只需要修改to_date中的格式参数和实际结构匹配即可,比如原格式为dd-MM-yyyy就将参数改为dd-MM-yyyy - 如果需要同时兼容波斯数字,可将映射规则扩展为
east_arabic_nums = "٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹",对应latin_nums = "01234567890123456789"即可 - 转换完成后可以用
filter(col("standard_date").isNull())筛选出转换失败的异常日期做单独处理
内容的提问来源于stack exchange,提问作者Atif
相关产品推荐
相关产品推荐

