如何根据数据框中的另一个星期添加一个新的列?

sal*_*vyp 2 scala apache-spark nscala-time

我在数据框中有一个字段,当前格式化为字符串(mm/dd/yyyy),我想在该数据框中创建一个新列,该字段具有该字段的星期名称(即星期四).我已经进口了

import com.github.nscala_time.time.Imports._
Run Code Online (Sandbox Code Playgroud)

但我不知道从哪里开始.

zer*_*323 13

创建格式化程序:

val fmt = DateTimeFormat.forPattern("MM/dd/yyyy")
Run Code Online (Sandbox Code Playgroud)

解析日期:

val dt = fmt.parseDateTime("09/11/2015")
Run Code Online (Sandbox Code Playgroud)

获得一周中的一天:

dt.toString("EEEEE")
Run Code Online (Sandbox Code Playgroud)

使用它包装org.apache.spark.sql.functions.udf,你有一个完整的解决方案.仍然没有必要,因为HiveContext已经提供了所有必需的UDF:

val df = sc.parallelize(Seq(
   Tuple1("08/11/2015"), Tuple1("09/11/2015"), Tuple1("09/12/2015")
)).toDF("date_string")

df.registerTempTable("df")

sqlContext.sql(
  """SELECT date_string,
        from_unixtime(unix_timestamp(date_string,'MM/dd/yyyy'), 'EEEEE') AS dow
      FROM df"""
).show

// +-----------+--------+
// |date_string|     dow|
// +-----------+--------+
// | 08/11/2015| Tuesday|
// | 09/11/2015|  Friday|
// | 09/12/2015|Saturday|
// +-----------+--------+
Run Code Online (Sandbox Code Playgroud)

编辑:

从Spark 1.5开始,你可以使用from_unixtime,unix_timestamp直接起作用:

import org.apache.spark.sql.functions.{from_unixtime, unix_timestamp}

df.select(from_unixtime(
  unix_timestamp($"date_string", "MM/dd/yyyy"), "EEEEE").alias("dow"))
Run Code Online (Sandbox Code Playgroud)