如何根据数据框中的另一列添加带有星期几的新列?
How to add a new column with day of week based on another in dataframe?
我在当前格式为字符串 (mm/dd/yyyy) 的数据框中有一个字段,我想在该数据框中创建一个新列,其中包含该字段的星期几名称(即星期四) .我已经导入
import com.github.nscala_time.time.Imports._
但我不确定从这里到哪里去。
创建格式化程序:
val fmt = DateTimeFormat.forPattern("MM/dd/yyyy")
解析日期:
val dt = fmt.parseDateTime("09/11/2015")
获取星期几:
dt.toString("EEEEE")
使用 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|
// +-----------+--------+
编辑:
从 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"))
我在当前格式为字符串 (mm/dd/yyyy) 的数据框中有一个字段,我想在该数据框中创建一个新列,其中包含该字段的星期几名称(即星期四) .我已经导入
import com.github.nscala_time.time.Imports._
但我不确定从这里到哪里去。
创建格式化程序:
val fmt = DateTimeFormat.forPattern("MM/dd/yyyy")
解析日期:
val dt = fmt.parseDateTime("09/11/2015")
获取星期几:
dt.toString("EEEEE")
使用 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|
// +-----------+--------+
编辑:
从 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"))