Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark:如何将历元日期转换为日期对象_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala Spark:如何将历元日期转换为日期对象

Scala Spark:如何将历元日期转换为日期对象,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,Spark:2.4.5带Scala 我在我的数据框中有一列,它保存了自epoch(1970)以来的天数。我正在寻找一种将其转换为日期列的方法 因此,我正在编写一个函数,如下所示: def from_epochday(epochDays: Column):Column = { date_add(to_date(lit("1970-01-01"), "YYYY-MM-DD") , epochDays /* Need to int and not a

Spark:2.4.5带Scala

我在我的数据框中有一列,它保存了自epoch(1970)以来的天数。我正在寻找一种将其转换为日期列的方法

因此,我正在编写一个函数,如下所示:

 def from_epochday(epochDays: Column):Column = {
    date_add(to_date(lit("1970-01-01"), "YYYY-MM-DD") , epochDays /* Need to int and not a Column*/)
  }

数据帧将具有:

df.withColumn("dob", from_epochday(col(epochDays)))
问题是date_add将Int作为输入,而我不知道如何将值获取为Int

也许我可以通过UDF函数来实现,但我不会试图避免

 val df = Seq(1).toDF("seq").select(
    from_unixtime(unix_timestamp(),"MM-dd-yyyy").as("date_1"),
    from_unixtime(unix_timestamp(),"dd-MM-yyyy HH:mm:ss").as("date_2"),
     from_unixtime(unix_timestamp(),"yyyy-MM-dd").as("date_3")
   ).show(false)

    • 一天有86400秒。您可以将其与历元天数相乘,得到历元秒,然后使用\u unixtime中的

      scala> java.time.LocalDate.ofEpochDay(1)
      res16: java.time.LocalDate = 1970-01-02
      
      scala> java.time.LocalDate.ofEpochDay(2)
      res17: java.time.LocalDate = 1970-01-03
      
      scala> val df = Seq(1,2).toDF("days")
      df: org.apache.spark.sql.DataFrame = [days: int]
      
      scala> df.withColumn("date", from_unixtime(col("days")*86400, "yyyy-MM-dd").cast("date")).show
      +----+----------+
      |days|      date|
      +----+----------+
      |   1|1970-01-02|
      |   2|1970-01-03|
      +----+----------+
      

      这里有另一种方法,你可以做到这一点

      df = spark.createDataFrame(
          [
              (1, 18508),
      
          ],
          schema=StructType(
              [
                  StructField('Id', StringType(), True),
                  StructField('Epoch_days', LongType(), True)
              ]
          )
      )
      
      df.withColumn(
          'date',
          (col('Epoch_days')*86400).cast('timestamp') 
      ).show(truncate=False)
      
      #+---+----------+-------------------+
      #|Id |Epoch_days|date               |
      #+---+----------+-------------------+
      #|1  |18508     |2020-09-03 00:00:00|
      #+---+----------+-------------------+
      

      from_unixtime()//将unix历元(1970-01-01 00:00:00 UTC)的秒数转换为字符串。我拥有的是几天而不是几秒钟。所以这个函数将导致不正确的值我正在从Java中查找LocalDate of epochDay(long epochDay),我已经尝试过了,但这对我不起作用。o/p数据总是比实际少1天,这复制了LocalDate.ofEpochDay的确切行为。但是,如果您想要不同的行为,您可以在与86400相乘之前在epochDay中加/减1。