如何使用 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 纪元时间?