如何将镶木地板文件的 int64 数据类型列转换为 SparkSQL 数据框中的时间戳?

Posted

技术标签:

【中文标题】如何将镶木地板文件的 int64 数据类型列转换为 SparkSQL 数据框中的时间戳?【英文标题】:How to convert int64 datatype columns of parquet file to timestamp in SparkSQL data frame? 【发布时间】:2019-01-24 19:25:35 【问题描述】:

我的 DataFrame 如下所示:

+----------------+-------------+
|   Business_Date|         Code|
+----------------+-------------+
|1539129600000000|          BSD|
|1539129600000000|          BTN|
|1539129600000000|          BVI|
|1539129600000000|          BWP|
|1539129600000000|          BYB|
+----------------+-------------+

在将数据加载到 hive 表时,我想将 Business_Date 列从 bigint 转换为 timestamp 值。

我该怎么做?

【问题讨论】:

如何从 parquet 文件中读取 bigint 时间戳字段?我收到错误“无法为 Parquet 类型为可选 int64 时间戳的数据类型“时间戳”创建 Parquet 转换器? 【参考方案1】:

您可以使用pyspark.sql.functions.from_unixtime(),它将

将 unix 纪元 (1970-01-01 00:00:00 UTC) 的秒数转换为以给定格式表示当前系统时区中那个时刻的时间戳的字符串。

看来您的Business_Date 需要除以1M 才能转换为秒。

例如:

from pyspark.sql.functions import from_unixtime, col

df = df.withColumn(
    "Business_Date",
    from_unixtime(col("Business_Date")/1000000).cast("timestamp")
)
df.show()
#+---------------------+----+
#|Business_Date        |Code|
#+---------------------+----+
#|2018-10-09 20:00:00.0|BSD |
#|2018-10-09 20:00:00.0|BTN |
#|2018-10-09 20:00:00.0|BVI |
#|2018-10-09 20:00:00.0|BWP |
#|2018-10-09 20:00:00.0|BYB |
#+---------------------+----+

from_unixtime 返回一个字符串,因此您可以将结果转换为 timestamp

现在是新架构:

df.printSchema()
#root
# |-- Business_Date: timestamp (nullable = true)
# |-- Code: string (nullable = true)

【讨论】:

感谢您的回答,我可以看到数据类型为 long 而不是时间戳,我们如何将其转换为时间戳类型,我们是否可以只保留一列具有正确值而其他列可以排除?跨度> @ASK 如果您在withColumn 中指定相同的名称,则可以覆盖该列并将结果分配回原始DataFrame。

以上是关于如何将镶木地板文件的 int64 数据类型列转换为 SparkSQL 数据框中的时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spark 将镶木地板文件加载到 Hive 表中?

如何将镶木地板文件从 s3 导入到 postgresql rds

将镶木地板文件加载到红移时如何格式化时间戳字段?

awswrangler 将镶木地板数据帧写入单个文件

将镶木地板文件读入数据框时如何为文件夹结构指定架构[重复]

使用 pyspark 将镶木地板文件(在 aws s3 中)存储到 spark 数据框中