Как выбрать 13-значный столбец метки времени из файла паркета, преобразовать его в дату и сохранить в виде фрейма данных? - PullRequest
0 голосов
/ 25 марта 2019

Поскольку я новичок в Apache-методах Spark и Scala, я хочу выполнить следующие задачи.

-Читать определенный столбец из файла паркета (13-значная временная метка).

-Преобразовать метку времени в обычный формат даты (гггг-ММ-дд ЧЧ: мм: сс).

- Сохранить результат как другой столбец в наборе данных.

Я могу прочитать отметку времени, используя следующий код

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:

Я ожидаю для фрейма данных с 2 столбцами вкакая из них должна содержать метку времени из 13 цифр, а другая должна содержать cперевернутое время из 13 цифр в общий формат даты (гггг-мм-дд чч: мм: сс).

Я хотел бы получить решение, спасибо заранее.

1 Ответ

2 голосов
/ 25 марта 2019

sqlcon.read.parquet вернет сам фрейм данных.Все, что вам нужно сделать, это добавить новый столбец, используя метод withcolumn.Это должно сработать.

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

Я обновил свой код следующим образом, в котором 13-значное unix-время преобразуется в 10-значное путем деления на 1000 и преобразования его в 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|
...