如何使用 Java 将 unix 纪元的列转换为 Apache spark DataFrame 中的日期?

Posted

技术标签:

【中文标题】如何使用 Java 将 unix 纪元的列转换为 Apache spark DataFrame 中的日期?【英文标题】:How do I convert column of unix epoch to Date in Apache spark DataFrame using Java? 【发布时间】:2016-04-10 03:28:20 【问题描述】:

我有一个 json 数据文件,其中包含一个属性 [creationDate],它是“长”数字类型的 unix epoc。 Apache Spark DataFrame 架构如下所示:

根 |-- creationDate: long (nullable = true) |-- id: long (可为空 = true) |-- postTypeId:长(可为空=真) |-- 标签:数组(可为空=真) | |-- 元素:字符串(包含Null = true) |-- 标题:字符串(可为空=真) |-- viewCount: long (nullable = true)

我想做一些需要从“creationDate”获取的groupBy“creationData_Year”。

使用 Java 在 DataFrame 中进行这种转换的最简单方法是什么?

【问题讨论】:

【参考方案1】:

在检查了spark dataframe api和sql函数后,我出现在sn-p下面:

DateFrame df = sqlContext.read().json("MY_JSON_DATA_FILE"); DataFrame df_DateConverted = df.withColumn("creationDt", from_unixtime(***_Tags.col("creationDate").divide(1000)));

“creationDate”列除以“1000”的原因是因为TimeUnit不同。原始“creationDate”是“毫秒”中的 unix 纪元,但是 spark sql“from_unixtime”旨在处理“second 中的 unix 纪元>”。

【讨论】:

您最初的问题是关于 long creationDate 的“分组依据”粒度? 是的,我想按“creationDate”的“年”和“月”分组,然后进行一些聚合。 那么按原始创建日期列分组有什么问题? 因为JSON中的原始数据类型是“long”(unix epoc),所以需要将此字段转换为“Year”和“Month”,例如:1452066042000需要转换为“2016”用于“createDate_Year”列,“1”用于“createDate_Month”列。这样,我可以利用 spark df.groupBy() 和其他一些聚合函数来计算。【参考方案2】:

pyspark 从 Unix 纪元毫秒转换为数据帧时间戳

df.select(from_unixtime((df.my_date_column.cast('bigint')/1000)).cast('timestamp').alias('my_date_column'))

【讨论】:

【参考方案3】:

在火花斯卡拉中,

spark.sql("select from_unixtime(1593543333062/1000) as ts").show(false)

【讨论】:

以上是关于如何使用 Java 将 unix 纪元的列转换为 Apache spark DataFrame 中的日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中将 10131520 转换为 Unix 纪元时间?

如何将 13 位 unix 纪元时间格式转换为日期时间?

PostgreSQL:如何从 Unix 纪元转换为日期?

将 UNIX 纪元转换为日期对象

如何在 kotlin 中将纪元时间戳转换为 unix 十六进制时间戳?

如何将 df 中的列转换为具有日期时间格式的纪元,反之亦然?