【问题标题】:How to find a median value in pyspark如何在pyspark中找到中值
【发布时间】:2021-03-17 13:53:04
【问题描述】:

这些是我的日期框的值:

+-------+----------+
|     ID| Date_Desc|
+-------+----------+
|8951354|2012-12-31|
|8951141|2012-12-31|
|8952745|2012-12-31|
|8952223|2012-12-31|
|8951608|2012-12-31|
|8950793|2012-12-31|
|8950760|2012-12-31|
|8951611|2012-12-31|
|8951802|2012-12-31|
|8950706|2012-12-31|
|8951585|2012-12-31|
|8951230|2012-12-31|
|8955530|2012-12-31|
|8950570|2012-12-31|
|8954231|2012-12-31|
|8950703|2012-12-31|
|8954418|2012-12-31|
|8951685|2012-12-31|
|8950586|2012-12-31|
|8951367|2012-12-31|
+-------+----------+

我尝试在 pyspark 中创建日期列的中值:

df1 = df1.groupby('Date_Desc').agg(f.expr('percentile(ID, array(0.25))')[0].alias('%25'),
                             f.expr('percentile(ID, array(0.50))')[0].alias('%50'),
                             f.expr('percentile(ID, array(0.75))')[0].alias('%75')) 

但我得到了一个错误:

Py4JJavaError:调用 o198.showString 时出错。 : org.apache.spark.SparkException:作业因阶段失败而中止: 阶段 29.0 中的任务 1 失败 1 次,最近一次失败:丢失任务 1.0 in stage 29.0 (TID 427, 5bddc801333f, executor driver): org.apache.spark.SparkUpgradeException: You may get a different result 由于 Spark 3.0 的升级: Fail to parse '11/23/04 9:00' in 新的解析器。您可以将 spark.sql.legacy.timeParserPolicy 设置为 LEGACY 恢复 Spark 3.0 之前的行为,或设置为 CORRECTED 并将其视为无效的日期时间字符串。

【问题讨论】:

  • 这能回答你的问题吗? to_date fails to parse date in Spark 3.0
  • 使用提供的示例数据和代码sn-p无法重现错误。它可能来自此转换之前的某些日期解析。您可以参考链接的问题。
  • 非常感谢,按照上面链接中的步骤,我可以成功更改数据列。

标签: apache-spark pyspark apache-spark-sql median


【解决方案1】:

使用 Spark ≥ 3.1.0:

from pyspark.sql.functions import percentile_approx

df1.groupBy("Date_Desc").agg(percentile_approx("ID", 0.5).alias("%50"))

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2020-10-13
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多