我有一个数据框,其中一列A被定义为字符串列类型,但列中的数据实际上是日期。例如,列A为“20170506”,我想将列A转换为日期类型。首先,我使用了以下方法:
df = df1.withColumn('A', df['A'].cast(DateType())
结果是A列的所有项都转换为null。我查看了spark API的官方文档,并意识到A列的格式应该是'yyyy-MM-dd',就像“2017-05-06”一样。
所以,我用另一种方式:
# 1. use udf function
func = udf (lambda x: datetime.strptime(x, '%Y-%m-%d'), DateType())
df = df1.withColumn('A', func(col('A')))
# 2. use to_date function
df.select(to_date(from_unixtime(unix_timestamp(df['A'], 'yyyy-MM-dd'))).alias('A'))
我认为无论哪种方式都不是一个好主意,因为它是复杂的,而不是简短的。
为什么to_date(col)
无法设置列字符串的格式,就像这样:to_date(col, 'yyyy-MM-dd')
,我认为这对我们来说非常重要(顺便说一下,Hive Sql也不能设置!)
并且,在DataFrames中将列类型从String更改为Date的最佳方法是什么?感谢:)
答案 0 :(得分:0)
您可以使用函数to_date
将数据类型从String更改为Datedataframe.select(to_date($"dateCol", "dd-MMM-yyyy").alias("date"))
或者您可以使用unix_timestamp
dataframe.select(to_date(unix_timestamp($"datecol", "dd-MMM-yyyy").cast("timestamp")).alias("timestamp"))