在Spark Dataframe

时间:2018-04-06 20:35:48

标签: scala apache-spark

我有一个包含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_timestampfrom_unixtimestampto_datecast(“date”)但没有任何效果

我需要以下架构作为输出:

df2.printSchema
|-- f1: string (nullable = false)
|-- f2: date (nullable = false)

我使用的是Spark 2.1

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"))
)