如何用pandas-on-spark将Parquet字符串列转为datetime64[ns]
解决方案
要在pandas-on-spark中高效将字符串列转为datetime类型,不要用astype,改用pandas-on-spark原生的时间解析方法,或者在Spark DataFrame阶段提前转换,具体方法如下:
方法1:使用pandas-on-spark原生to_datetime(推荐)
pandas-on-spark的Series.to_datetime是分布式实现的,性能远优于本地的pd.to_datetime,且能正确解析字符串格式:
情况1:已知字符串格式(性能最优)
如果明确col3的时间字符串格式,直接指定format参数:
df = spark.read.parquet("input.parquet") psdf = df.to_pandas_on_spark() # 替换为你的时间字符串实际格式,比如%Y-%m-%d %H:%M:%S psdf['reCasted'] = psdf['col3'].to_datetime(format='%Y-%m-%d %H:%M:%S')
情况2:未知格式,自动推断
如果不确定格式,可让方法自动推断(比指定格式稍慢,但仍比pd.to_datetime高效):
psdf['reCasted'] = psdf['col3'].to_datetime(errors='coerce') # 转换失败返回NaT
方法2:在Spark DataFrame阶段提前转换
如果数据量较大,在读取Parquet后直接用Spark的to_timestamp函数转换,再转为pandas-on-spark DataFrame,性能可能更优:
from pyspark.sql.functions import to_timestamp df = spark.read.parquet("input.parquet") # 指定时间格式,或省略format让Spark自动推断 df = df.withColumn("reCasted", to_timestamp(df.col3, "yyyy-MM-dd HH:mm:ss")) psdf = df.to_pandas_on_spark()
为什么astype会失败?
astype('datetime64[ns]')仅适用于可直接转换为datetime的类型(比如整数时间戳、已标准化的datetime字符串),对于非标准格式的字符串,pandas-on-spark不会自动解析格式,因此直接返回NaT。必须用专门的时间解析方法来处理字符串转datetime的场景。
内容的提问来源于stack exchange,提问作者user2531569
相关产品推荐
相关产品推荐

