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

时间:2019-03-25 05:47:55

标签: scala apache-spark intellij-idea apache-spark-sql parquet

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

-从镶木地板文件中读取特定列(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://stackoverflow.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:

我希望有两列的数据帧,其中一列应包含13位时间戳,另一列应包含从13位到常规日期格式的转换时间(yyyy-MM-dd HH:mm:ss)。

我希望得到一个解决方案,谢谢。

1 个答案:

答案 0 :(得分:2)

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|