【问题标题】:How to create Date and Hour columns from Seconds column using SQL如何使用 SQL 从 Seconds 列创建 Date 和 Hour 列
【发布时间】:2020-02-16 06:20:51
【问题描述】:

我有一个名为Time 的列,其中浮点值给出了第一个事件发生后的时间(以秒为单位)。我想知道如何在 SQL 中使用此列创建名为 DateHour 的列。

我的数据集很大,我不能使用 Pandas。

设置

import numpy as np
import pandas as pd

import pyspark
from pyspark.sql.functions import col
from pyspark.sql.functions import udf # @udf("integer") def myfunc(x,y): return x - y
from pyspark.sql import functions as F # stddev format_number date_format, dayofyear, when


spark = pyspark.sql.SparkSession.builder.appName('bhishan').getOrCreate()

数据

%%bash

cat > data.csv << EOL
Time
10.0
61.0
3500.00
3600.00
3700.54
7000.22
7200.22
15000.55
86400.22
EOL

pyspark 数据帧

df = spark.read.csv('data.csv', header=True, inferSchema=True)
print('nrows = ', df.count(), 'ncols = ', len(df.columns))
df.show()
nrows =  9 ncols =  1
+--------+
|    Time|
+--------+
|    10.0|
|    61.0|
|  3500.0|
|  3600.0|
| 3700.54|
| 7000.22|
| 7200.22|
|15000.55|
|86400.22|
+--------+

使用 pandas(但我需要 pyspark)

pandas_df = df.toPandas()
pandas_df['Date'] = pd.to_datetime('2019-01-01') + pd.to_timedelta(pandas_df['Time'],unit='s')

pandas_df['hour'] = pandas_df['Date'].dt.hour
print(pandas_df)
       Time                    Date  hour
0     10.00 2019-01-01 00:00:10.000     0
1     61.00 2019-01-01 00:01:01.000     0
2   3500.00 2019-01-01 00:58:20.000     0
3   3600.00 2019-01-01 01:00:00.000     1
4   3700.54 2019-01-01 01:01:40.540     1
5   7000.22 2019-01-01 01:56:40.220     1
6   7200.22 2019-01-01 02:00:00.220     2
7  15000.55 2019-01-01 04:10:00.550     4
8  86400.22 2019-01-02 00:00:00.220     0

问题

如何使用 SQL 和 Pyspark 获取新列 DateHour,就像我在 pandas 中所做的那样。 我有无法使用 pandas 的大数据,我必须为此使用 pyspark。谢谢。

【问题讨论】:

    标签: python sql pandas apache-spark pyspark


    【解决方案1】:

    您可以使用函数:timestampunix_timestamphour

    from pyspark.sql.functions import expr, hour
    
    df.withColumn('Date', expr("timestamp(unix_timestamp('2019-01-01 00:00:00') + Time)")) \
      .withColumn('hour', hour('Date')) \
      .show(truncate=False)                                              
    
    +--------+----------------------+----+
    |Time    |Date                  |hour|
    +--------+----------------------+----+
    |10.0    |2019-01-01 00:00:10   |0   |
    |61.0    |2019-01-01 00:01:01   |0   |
    |3500.0  |2019-01-01 00:58:20   |0   |
    |3600.0  |2019-01-01 01:00:00   |1   |
    |3700.54 |2019-01-01 01:01:40.54|1   |
    |7000.22 |2019-01-01 01:56:40.22|1   |
    |7200.22 |2019-01-01 02:00:00.22|2   |
    |15000.55|2019-01-01 04:10:00.55|4   |
    |86400.22|2019-01-02 00:00:00.22|0   |
    +--------+----------------------+----+
    

    注意:使用时间戳功能保持微秒

    使用 SQL 语法:

    df.createOrReplaceTempView('t_df')
    
    spark.sql(""" 
        WITH d AS (SELECT *, timestamp(unix_timestamp('2019-01-01 00:00:00') + Time) as Date FROM t_df) 
        SELECT *, hour(d.Date) AS hour FROM d   
    """).show(truncate=False) 
    

    【讨论】:

      【解决方案2】:

      您是否考虑过尝试考拉 (https://github.com/databricks/koalas)?从 pandas 迁移到 Koalas 相当容易,您不必担心 Apache Spark 的 DataFrame API 的学习曲线。

      【讨论】:

      • 感谢您的建议。我会研究一下。但目前,我正在学习 SQL 和 PySpark。我熟悉 Python 和 Pandas,但不熟悉 SQL。有时,SQL 与 python 一起需要。
      猜你喜欢
      • 2021-09-10
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 2016-03-27
      • 1970-01-01
      相关资源
      最近更新 更多