mysql - 如何使用 SQL 将小时范围转换为总小时数?

标签 mysql sql pyspark databricks

我目前正在使用 Yelp 的数据集,我的目标是找出企业每周营业的总时间。从数据中,我能够提取每天的时间范围,例如某一天的“9:0-0:0”或“17:30-21:30”。如何使用 SQL 获取这些每小时范围的单个值?

这是我用来简单显示数据集中企业营业时间的一些代码。

df_busSelected = df_business.select("business_id", "name"
                   , "hours.Sunday", "hours.Monday", "hours.Tuesday"
                   ,"hours.Wednesday", "hours.Thursday", "hours.Friday"
                   , "hours.Saturday")
df_busSelected.show()

我希望制作一个新专栏,其中包含给定范围内企业每周营业的总小时数。

最佳答案

使用 pyspark,您可以执行以下操作:

from pyspark.sql.functions import expr

df.withColumn('h', expr('split(hours, "[-:]")').astype('array<int>')) \
  .withColumn('h1', expr('''
        h[2] - h[0] + IF(h[2]<h[0],24,0) + round((h[3]-h[1])/60,0)
   ''').astype('int')) \
  .show()
+----------+-----------+----------------+---+
|     bdate|      hours|               h| h1|
+----------+-----------+----------------+---+
|2019-10-17|    9:0-0:0|    [9, 0, 0, 0]| 15|
|2019-10-18|17:30-21:30|[17, 30, 21, 30]|  4|
+----------+-----------+----------------+---+

首先使用字符集[-:]hours列拆分为包含4个项目的数组(名为h)并进行转换转换为 int 数组(最初为 StringType 数组)

然后进行简单的数学运算,最后再次将结果类型转换为 int

接下来,使用 date_format('bdate', 'EEEE') 获取周名称,然后使用 groupbypivot 以及可能 agg + sum 函数得到最终结果

关于mysql - 如何使用 SQL 将小时范围转换为总小时数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58441790/

相关文章:

SQL GROUP BY-使用COUNT()函数

sql - Oracle 将 NCLOB 数据解析到输出或新表

python - 如果不将 Anaconda 库添加到 %PATH,Zeppelin %python.conda 和 %python.sql 解释器将无法工作

python - 将每个元素视为元组时,在 PySpark 中加入 2 个 RDD

mysql - 多对多关系修复

python - 在 Python 中创建自定义 Spark RDD

php - 更新到 MySQLi 并遇到一些问题

mysql - MySQL 中良好的一对多关系实践

php - 使用 PHPMyAdmin 生成 ERD/数据库架构

mysql - 从 MySQL 获取特定列