PySpark:在汇总负数分布时,describe() 函数出错——最小值和最大值翻转

Posted

技术标签:

【中文标题】PySpark:在汇总负数分布时,describe() 函数出错——最小值和最大值翻转【英文标题】:PySpark: Error in describe() function when summarizing distribution of negative numbers -- min and max values flipped 【发布时间】:2019-08-14 22:19:09 【问题描述】:

我正在尝试通过使用 PySpark describe() 函数汇总我的数据集中的测量分布来执行一些探索性数据分析。但是,对于具有负分布的测量值,最小值和最大值似乎颠倒了。

chicago_crime.describe('latitude', 'longitude').show()

+-------+-------------------+--------------------+
|summary|           latitude|           longitude|
+-------+-------------------+--------------------+
|  count|            6811141|             6811141|
|   mean|  41.84203025139101|  -87.67177837500668|
| stddev|0.08994460772003067|0.062086304377221284|
|    min|       36.619446395|       -87.524529378|
|    max|       42.022910333|       -91.686565684|
+-------+-------------------+--------------------+

longitude 测量具有负分布。我预计longitude 的最小值为 -91.686565684,最大值为 -87.524529378。

有没有其他人注意到这个错误? PySpark 开发人员能否纠正此错误?

根据下面的要求,这里是printSchema() 输出。

chicago_crime.printSchema()

root
 |-- latitude: string (nullable = true)
 |-- longitude: string (nullable = true)

然后转换为浮点数会显示预期的结果。

chicago_crime = chicago_crime.withColumn('latitude', chicago_crime.latitude.astype('float'))
chicago_crime = chicago_crime.withColumn('longitude', chicago_crime.longitude.astype('float'))

chicago_crime.describe('latitude', 'longitude').show()

+-------+-------------------+--------------------+
|summary|           latitude|           longitude|
+-------+-------------------+--------------------+
|  count|            6810978|             6810978|
|   mean|  41.84215369600549|   -87.6716834892099|
| stddev|0.08628712634075986|0.058938763393995654|
|    min|          41.644585|          -87.934326|
|    max|           42.02291|           -87.52453|
+-------+-------------------+--------------------+

【问题讨论】:

几乎可以肯定,问题在于您的列是StringType() 而不是数字 - 因此短按字典顺序发生。显示chicago_crime.printSchema() 的输出以进行检查。 请看上面的输出。你是对的。 how to change a Dataframe column from String type to Double type in pyspark的可能重复 将您的列转换为双精度类型,然后计算统计信息。 @pault 我已经转换为浮动并计算了统计数据。结果符合预期。感谢您的帮助! 【参考方案1】:

我试过下面的代码:

from pyspark.sql import Row
df = spark.sparkContext.parallelize([Row(-1),Row(-2), Row(-3)]).toDF()
df.describe().show()

我得到了如下的预期结果:

+-------+----+
|summary|  _1|
+-------+----+
|  count|   3|
|   mean|-2.0|
| stddev| 1.0|
|    min|  -3|
|    max|  -1|
+-------+----+

【讨论】:

它很适合你,但这并不能回答 OP 的问题,除了表明 describe() 能够正确排序负数,这并不是一个特别令人惊讶的结果。

以上是关于PySpark:在汇总负数分布时,describe() 函数出错——最小值和最大值翻转的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 列转换具有正数和负数的字符串

pyspark shell 未以伪分布式模式启动

在 PySpark DataFrame 中添加汇总输出作为新行

Pyspark基础使用

PySpark 汇总数据框

为啥 PySpark 中的 agg() 一次只能汇总一列? [复制]