我有一个包含2个df1
字段的数据框(StringType
)。
Field1(StringType)值 - X
Field2(StringType)值 - 20180101
我要做的就是从df2
创建另一个包含2个字段的数据框(df1
) -
Field1(StringType)值 - 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
答案 0 :(得分:2)
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
格式的显式字符串格式:< / p>
val df2 = df1.withColumn(
"c2", to_date(regexp_replace($"c2", "(\\d{4})(\\d{2})(\\d{2})", "$1-$2-$3"))
)