PySpark DataFrame中approxQuantile结果从列表转列的实现方案
解决Spark approxQuantile结果转指定表格格式的问题
我来帮你搞定这个转换问题!首先得搞清楚approxQuantile的返回结构:它返回的是一个嵌套列表,外层列表的每个元素对应你传入的列的分位数结果——你传了['Apple', 'Oranges'],那返回的第一个子列表就是Apple列的所有分位数,第二个就是Oranges列的。
接下来我们只需要把这些分位数和对应的百分比(比如0.1→10)一一对应,再转换成Spark DataFrame就能得到你想要的格式了。以下是完整的实现代码:
from pyspark.sql.types import StructType, StructField, IntegerType, DoubleType # 1. 定义要计算的分位数数值(和你之前用的一致) quantile_values = [0.1, 0.25, 0.5, 0.75, 0.9, 0.95] # 2. 获取approxQuantile的结果 quantile_results = df.approxQuantile(['Apple', 'Oranges'], quantile_values, 0.1) # 3. 把分位数转换成百分比(比如0.1转为10,方便显示) percentile_list = [int(q * 100) for q in quantile_values] # 4. 构造DataFrame的数据源:将百分比、Apple分位数、Oranges分位数一一配对 data = list(zip(percentile_list, quantile_results[0], quantile_results[1])) # 5. 定义结果DataFrame的Schema,确保列名和数据类型符合需求 result_schema = StructType([ StructField("Percentile", IntegerType(), nullable=False), StructField("Apple", DoubleType(), nullable=True), StructField("Oranges", DoubleType(), nullable=True) ]) # 6. 创建最终的结果DataFrame result_df = spark.createDataFrame(data, schema=result_schema) # 7. 展示结果,格式就和你期望的一致了 result_df.show()
补充说明:
- 如果你的
Apple/Oranges列的分位数都是整数,可以把Schema里的DoubleType()改成IntegerType(),避免显示小数末尾的.0; - 运行
result_df.show()后,输出的表格结构就会和你给出的示例完全匹配,包含Percentile、Apple、Oranges三列,每行对应一个分位数的结果。
内容的提问来源于stack exchange,提问作者Sun
相关产品推荐
相关产品推荐

