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() 函数出错——最小值和最大值翻转的主要内容,如果未能解决你的问题,请参考以下文章