Apache spark 列之间的Spark SQL Datediff(分钟)

Apache spark 列之间的Spark SQL Datediff(分钟),apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我在一个表中有两列(两个日期,格式为字符串类型)。我需要在几分钟内找出它们之间的差异,然后在一年内求出平均值 格式如下: 请求时间:2019年10月11日03:10:15下午 响应时间:2029年11月10日03:20:10下午 有什么建议吗?不需要自定义项。只需使用spark sql函数,如下所示: You can register a user defined function import datetime def min_diff(a,b): start_time = datet

我在一个表中有两列(两个日期,格式为字符串类型)。我需要在几分钟内找出它们之间的差异,然后在一年内求出平均值

格式如下: 请求时间:2019年10月11日03:10:15下午 响应时间:2029年11月10日03:20:10下午


有什么建议吗?

不需要自定义项。只需使用spark sql函数,如下所示:

You can register a user defined function 

import datetime
def min_diff(a,b):
  start_time = datetime.datetime.strptime(a,'%m/%d/%Y %I:%M:%S %p')
  end_time = datetime.datetime.strptime(b,'%m/%d/%Y %I:%M:%S %p')
  return (end_time-start_time).total_seconds()/60
def year(c):
  return datetime.datetime.strptime(c,'%m/%d/%Y %I:%M:%S %p').strftime('%Y')
spark.udf.register(name='min_diff',f=lambda a,b:min_diff(a,b))
spark.udf.register(name='year', f=lambda c:year(c))
spark.sql('select avg(min_diff(start_time,end_time)) avg_time_diff, year(start_time) year from test_table group by year').show()
import pyspark.sql.functions as F

df = spark.createDataFrame([
    ['11/10/2019 03:10:15 PM','11/10/2019 03:20:10 PM']
]).toDF('Requesttime','Respondtime')

df = df.withColumn(
    'diff_minutes',
    (F.to_timestamp('Respondtime', 'dd/MM/yyyy hh:mm:ss a').cast('bigint') -
     F.to_timestamp('Requesttime', 'dd/MM/yyyy hh:mm:ss a').cast('bigint')) / 60
)

df.show(truncate=False)
+----------------------+----------------------+-----------------+
|Requesttime           |Respondtime           |diff_minutes     |
+----------------------+----------------------+-----------------+
|11/10/2019 03:10:15 PM|11/10/2019 03:20:10 PM|9.916666666666666|
+----------------------+----------------------+-----------------+
如果你想平均一年的差异,你可以这样做

df.groupBy(
    F.year(F.to_timestamp('Requesttime', 'dd/MM/yyyy hh:mm:ss a')).alias('year')
).agg(F.avg('diff_minutes'))

不需要自定义项。只需使用spark sql函数,如下所示:

import pyspark.sql.functions as F

df = spark.createDataFrame([
    ['11/10/2019 03:10:15 PM','11/10/2019 03:20:10 PM']
]).toDF('Requesttime','Respondtime')

df = df.withColumn(
    'diff_minutes',
    (F.to_timestamp('Respondtime', 'dd/MM/yyyy hh:mm:ss a').cast('bigint') -
     F.to_timestamp('Requesttime', 'dd/MM/yyyy hh:mm:ss a').cast('bigint')) / 60
)

df.show(truncate=False)
+----------------------+----------------------+-----------------+
|Requesttime           |Respondtime           |diff_minutes     |
+----------------------+----------------------+-----------------+
|11/10/2019 03:10:15 PM|11/10/2019 03:20:10 PM|9.916666666666666|
+----------------------+----------------------+-----------------+
如果你想平均一年的差异,你可以这样做

df.groupBy(
    F.year(F.to_timestamp('Requesttime', 'dd/MM/yyyy hh:mm:ss a')).alias('year')
).agg(F.avg('diff_minutes'))