Apache spark 列之间的Spark SQL Datediff(分钟)
我在一个表中有两列(两个日期,格式为字符串类型)。我需要在几分钟内找出它们之间的差异,然后在一年内求出平均值 格式如下: 请求时间:2019年10月11日03:10:15下午 响应时间:2029年11月10日03:20:10下午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
有什么建议吗?不需要自定义项。只需使用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'))