如何从 parquet 文件中选择 13 位时间戳列,将其转换为日期并存储为数据框?

Posted

技术标签:

【中文标题】如何从 parquet 文件中选择 13 位时间戳列,将其转换为日期并存储为数据框?【英文标题】:How to select 13 digit timestamp column from parquet file,convert it to date and store as a data frame? 【发布时间】:2019-03-25 05:47:55 【问题描述】:

由于我是 Apache spark 和 Scala 方法的新手,我想执行以下需求。

-从 parquet 文件中读取特定列(13 位时间戳)。

-将时间戳转换为普通日期格式(yyyy-MM-dd HH:mm:ss)。

-将结果存储为数据集中的另一列。

我可以使用以下代码读取时间戳

import org.apache.spark.SparkConf

import org.apache.spark.SparkContext

import org.apache.spark.sql.SQLContext
object Test 

  def main(args: Array[String])
    val conf=new SparkConf().setAppName("TEST_APP").setMaster("local")
    val sc=new SparkContext(conf)
    val sqlcon=new SQLContext(sc)
    val Testdata = sqlcon.read.parquet("D:\\TestData.parquet")
    val data_eve_type_end=Testdata.select(Testdata.col("heading.timestamp")).where(Testdata.col("status").equalTo("Success")).toDF("13digitTime")
  

我尝试使用下面的参考链接转换时间戳

[https://***.com/a/54354790/9493078]

但这对我不起作用。我实际上不知道我是否正确地将数据提取到数据帧中。无论如何都会将输出作为列名 13digitTime 的表和值作为一些大小为 13 位的数字。

当我尝试从上面提到的链接中执行代码时,它会显示错误

WARN Utils: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.
Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve '(`13digitTime` / 1000000)' due to data type mismatch:

我期待具有 2 列的数据框,其中一列应包含 13 位时间戳,另一列应包含从 13 位转换为一般日期格式的时间(yyyy-MM-dd HH:mm:ss)。

我希望得到一个解决方案,在此先感谢。

【问题讨论】:

你能添加一些heading.timestamp的例子吗? @ApurbaPandey 例如:1551552902793 sqlcon.read.parquet 将返回一个数据框本身。您需要做的就是使用 withcolumn 方法添加一个新列。这应该有效。 val data_eve_type_end = Testdata.withColumn("13digitTime", from_unixtime($"heading.timestamp")) val date_conv=data_eve_type_end.select(col("timestamp_value").as("UNIX TIME"),from_unixtime(col("timestamp_value")/1000).cast("timestamp").as("GENERAL TIME")) @ApurbaPandey 这是我现在的代码。 @ApurbaPandey 它工作正常。感谢您提供宝贵的帮助。如何将此标记为正确答案? 【参考方案1】:

sqlcon.read.parquet 将返回一个数据框本身。您需要做的就是使用 withcolumn 方法添加一个新列。这应该可以。

val data_eve_type_end = Testdata.withColumn("13digitTime", from_unixtime($"heading.timestamp"))

我像这样更新了我的代码,其中 13 位 unix 时间通过除以 1000 转换为 10 位并将其转换为 tiimestamp。

val date_conv=data_eve_type_end.select(col("timestamp_value").as("UNIX TIME"),from_unixtime(col("timestamp_value")/1000).cast("timestamp").as("GENERAL TIME"))

输出是这样的

+-------------+-------------------+
|    UNIX TIME|       GENERAL TIME|
+-------------+-------------------+
|1551552902793|  2019-03-0 6:55:02|

【讨论】:

以上是关于如何从 parquet 文件中选择 13 位时间戳列,将其转换为日期并存储为数据框?的主要内容,如果未能解决你的问题,请参考以下文章

parquet 如何在 S3 中存储时间戳数据?

如何修复非法 Parquet 类型:INT64 (TIMESTAMP_MICROS) 错误

c#得到13位时间戳

如何在 mysql PDO 选择查询中仅从时间戳中选择时间?

附加到 parquet 文件,由具有重叠时间戳的数据分区

hive中如何将13位bigint类型的时间戳的转化为毫秒标准时间格式