scala - 如何创建带时间戳的 Spark 数据帧

标签 scala apache-spark

如何一步创建带有时间戳数据类型的 Spark 数据框?这是我分两步完成的方法。使用 Spark 2.4

首先使用时间戳字符串创建数据框

import org.apache.spark.sql.types._
import org.apache.spark.sql.functions.to_timestamp

val eventData = Seq(
  Row(1, "2014/01/01 23:00:01"), 
  Row(1, "2014/11/30 12:40:32"), 
  Row(2, "2016/12/29 09:54:00"), 
  Row(2, "2016/05/09 10:12:43")
)

val schema = StructType(List(
  StructField("typeId", IntegerType, false),
  StructField("eventTimeString", StringType, false)
))

val eventDF = spark.createDataFrame(
  sc.parallelize(eventData),
  schema
)
eventDF.show()

+------+-------------------+
|typeId|    eventTimeString|
+------+-------------------+
|     1|2014/01/01 23:00:01|
|     1|2014/11/30 12:40:32|
|     2|2016/12/29 09:54:00|
|     2|2016/05/09 10:12:43|
+------+-------------------+

然后将字符串转换为时间戳并删除字符串列
 val eventTimestampsDF = eventDF
  .withColumn("eventTime", to_timestamp($"eventTimeString", "yyyy/MM/dd k:mm:ss"))
  .drop($"eventTimeString")

如何消除第二步并直接创建时间戳?

最佳答案

你可以这样:

import java.sql.Timestamp
import spark.implicits._

val df = Seq(
  (1, Timestamp.valueOf("2014-01-01 23:00:01")),
  (1, Timestamp.valueOf("2014-11-30 12:40:32")),
  (2, Timestamp.valueOf("2016-12-29 09:54:00")),
  (2, Timestamp.valueOf("2016-05-09 10:12:43"))
).toDF("typeId","eventTime")

无需使用Row对象和自定义架构

关于scala - 如何创建带时间戳的 Spark 数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54890686/

相关文章:

scala - 如何将数据分发到工作节点

scala - 使用 Scala 的 Actor 时如何避免竞争条件

scala - Scala long 到字符串的转换打印空白

unit-testing - Scala 规范单元测试

apache-spark - 非分区 Parquet 数据的谓词下推

java - Apache Spark - 将 JavaRDD 转换为 DataFrame,反之亦然,性能会下降吗?

apache-spark - Effect PreservesPartitioning RDD true/false 为 mapPartitions 提供相同的结果

algorithm - 我怎样才能使用两个不同列表过滤器的结果?

python - PySpark 逐行函数组合

java - Spark,Fat Jar 的替代品