我有一个数据框(df1
)与 2StringType
fields.
Field1(字符串类型)值-X
Field2(字符串类型)值-20180101
我想做的就是创建另一个数据框(df2
) from df1
有 2 个字段-
Field1(字符串类型)值-X
Field2(日期类型)值-2018-01-01
我正在使用下面的代码-
df2=df1.select(
col("field1").alias("f1"),
unix_timestamp(col("field2"),"yyyyMMdd").alias("f2")
)
df2.show
df2.printSchema
对于这个字段 2,我尝试了多种方法 -unix_timestamp
, from_unixtimestamp
, to_date
, cast(“date”)
但没有任何作用
我需要以下架构作为输出:
df2.printSchema
|-- f1: string (nullable = false)
|-- f2: date (nullable = false)
我正在使用 Spark 2.1
to_date
似乎可以很好地满足您的需要:
import org.apache.spark.sql.functions._
val df1 = Seq( ("X", "20180101"), ("Y", "20180406") ).toDF("c1", "c2")
val df2 = df1.withColumn("c2", to_date($"c2", "yyyyMMdd"))
df2.show
// +---+----------+
// | c1| c2|
// +---+----------+
// | X|2018-01-01|
// | Y|2018-04-06|
// +---+----------+
df2.printSchema
// root
// |-- c1: string (nullable = true)
// |-- c2: date (nullable = true)
[UPDATE]
对于 Spark 2.1 或更早版本,to_date
不将格式字符串作为参数,因此显式字符串格式化为标准yyyy-MM-dd
格式使用,例如,regexp_replace
需要:
val df2 = df1.withColumn(
"c2", to_date(regexp_replace($"c2", "(\\d{4})(\\d{2})(\\d{2})", "$1-$2-$3"))
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)