spark scala 数据帧时间戳转换排序?
spark scala dataframe timestamp conversion sorting?
我有一个 csv 格式:
t,value
2012-01-12 12:30:00,4
2012-01-12 12:45:00,3
2012-01-12 12:00:00,12
2012-01-12 12:15:00,13
2012-01-12 13:00:00,7
我使用 spark-csv 将其转换为数据帧。 (所以 t
是 String
类型, value
是 Integer 类型)。什么是合适的 spark scala 方式以便输出按时间排序?
我正在考虑将 t
转换为允许数据帧 sortBy
的特定类型。但是我不熟悉哪种时间戳类型允许数据帧按时间排序。
鉴于格式,您可以将时间戳转换为
import org.apache.spark.sql.types.TimestampType
df.select($"t".cast(TimestampType)) // or df.select($"t".cast("timestamp"))
获取正确的日期时间或使用 unix_timestamp
(Spark 1.5+,在 Spark < 1.5 中,您可以使用同名的 Hive UDF)函数:
import org.apache.spark.sql.functions.unix_timestamp
df.select(unix_timestamp($"t"))
获取数字表示(Unix 时间戳 秒 )。
附带说明一下,您没有理由不能直接 orderBy($"t")
。字典顺序应该在这里工作得很好。
除了@zero323,如果你写的是纯SQL你可以使用CAST运算符如下:
df.registerTempTable("myTable")
sqlContext.sql("SELECT CAST(t as timestamp) FROM myTable")
如果您使用 'df.select' 进行转换,那么您可能只会获得指定的列。
要更改指定列的类型并保留其他列,请应用 'df.withColumn' 并传递原始列名。
import org.apache.spark.sql.types._
val df1 = df.withColumn("t",col("t").cast(TimestampType))
df1.printSchema
root
|-- t: timestamp (nullable = true)
|-- value: integer (nullable = true)
仅更改了列名 "t" 的数据类型。
其余部分保留。
我有一个 csv 格式:
t,value
2012-01-12 12:30:00,4
2012-01-12 12:45:00,3
2012-01-12 12:00:00,12
2012-01-12 12:15:00,13
2012-01-12 13:00:00,7
我使用 spark-csv 将其转换为数据帧。 (所以 t
是 String
类型, value
是 Integer 类型)。什么是合适的 spark scala 方式以便输出按时间排序?
我正在考虑将 t
转换为允许数据帧 sortBy
的特定类型。但是我不熟悉哪种时间戳类型允许数据帧按时间排序。
鉴于格式,您可以将时间戳转换为
import org.apache.spark.sql.types.TimestampType
df.select($"t".cast(TimestampType)) // or df.select($"t".cast("timestamp"))
获取正确的日期时间或使用 unix_timestamp
(Spark 1.5+,在 Spark < 1.5 中,您可以使用同名的 Hive UDF)函数:
import org.apache.spark.sql.functions.unix_timestamp
df.select(unix_timestamp($"t"))
获取数字表示(Unix 时间戳 秒 )。
附带说明一下,您没有理由不能直接 orderBy($"t")
。字典顺序应该在这里工作得很好。
除了@zero323,如果你写的是纯SQL你可以使用CAST运算符如下:
df.registerTempTable("myTable")
sqlContext.sql("SELECT CAST(t as timestamp) FROM myTable")
如果您使用 'df.select' 进行转换,那么您可能只会获得指定的列。 要更改指定列的类型并保留其他列,请应用 'df.withColumn' 并传递原始列名。
import org.apache.spark.sql.types._
val df1 = df.withColumn("t",col("t").cast(TimestampType))
df1.printSchema
root
|-- t: timestamp (nullable = true)
|-- value: integer (nullable = true)
仅更改了列名 "t" 的数据类型。 其余部分保留。