PySpark 为 DecimalType 列创建直方图数据框
PySpark create histogram dataframe for DecimalType column
如何使用以下架构为单列 DataFrame 创建平均分布的 bin 计数:
>>> df.schema
StructType(List(StructField(a,DecimalType(38,0),true)))
将数据框创建为 MWE:
from pyspark.sql import Row
from pyspark.sql.types import StructType, StructField, DecimalType
from decimal import Decimal
schema = StructType([StructField('a', DecimalType(38,0), True)])
df = spark.createDataFrame(
spark.sparkContext.parallelize([Row(a=Decimal(x)) for x in range(100)]),
schema
)
现在这是 often accepted answer:
df.select('a').rdd.flatMap(lambda x: x).histogram(10)
但它给出了类型错误:
TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float'
所以小数类型出了点问题。解决问题的方法是什么,或者如何将值转换为可接受的数据类型?
您可以使用地图转换为浮动:
df.select('a').rdd.flatMap(lambda x: x).map(float).histogram(10)
如何使用以下架构为单列 DataFrame 创建平均分布的 bin 计数:
>>> df.schema
StructType(List(StructField(a,DecimalType(38,0),true)))
将数据框创建为 MWE:
from pyspark.sql import Row
from pyspark.sql.types import StructType, StructField, DecimalType
from decimal import Decimal
schema = StructType([StructField('a', DecimalType(38,0), True)])
df = spark.createDataFrame(
spark.sparkContext.parallelize([Row(a=Decimal(x)) for x in range(100)]),
schema
)
现在这是 often accepted answer:
df.select('a').rdd.flatMap(lambda x: x).histogram(10)
但它给出了类型错误:
TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float'
所以小数类型出了点问题。解决问题的方法是什么,或者如何将值转换为可接受的数据类型?
您可以使用地图转换为浮动:
df.select('a').rdd.flatMap(lambda x: x).map(float).histogram(10)