存储火花数据框-pyspark

Posted

技术标签:

【中文标题】存储火花数据框-pyspark【英文标题】:bucketing a spark dataframe- pyspark 【发布时间】:2018-03-27 15:11:47 【问题描述】:

我有一个带有列(年龄)的 spark 数据框。我需要编写一个 pyspark 脚本来将数据框存储为 10 岁的范围(例如 11-20 岁、21-30 岁、...)并找到每个年龄跨度条目的计数。需要有关如何操作的指导熬过这个

例如:

我有以下数据框

+-----+
|age  |  
+-----+
|   21|      
|   23|     
|   35|     
|   39|    
+-----+

分桶后(预期)

+-----+------+
|age  | count|
+-----+------+
|21-30|    2 |    
|31-40|    2 |      
+-----+------+

【问题讨论】:

你有尝试过吗?请在how to create good reproducible apache spark dataframe examples 上阅读此帖子并尝试提供minimal reproducible example。 【参考方案1】:

运行此类计算的一种简单方法是计算底层 RDD 的直方图。

鉴于已知的年龄范围(幸运的是,这很容易组合在一起 - 这里使用 1、11、21 等),生成直方图相当容易:

hist = df.rdd\
  .map(lambda l: l['age'])\
  .histogram([1, 11, 21,31,41,51,61,71,81,91])

这将返回一个包含“年龄范围”及其各自观察计数的元组,如下所示:

([1, 11, 21, 31, 41, 51, 61, 71, 81, 91],
  [10, 10, 10, 10, 10, 10, 10, 10, 11])

然后您可以使用以下方法将其转换回数据框:

#Use zip to link age_ranges to their counts
countTuples = zip(hist[0], hist[1])
#make a list from that
ageList = list(map(lambda l: Row(age_range=l[0], count=l[1]), countTuples))
sc.parallelize(ageList).toDF()

有关更多信息,请查看the RDD API 中的histogram 函数文档

【讨论】:

嘿@ernest kiwele 感谢您的回复。我试过你的方法,它给了我想要的输出。答案是元组的形式。我需要它作为 datframe,以便我可以将它插入到蜂巢表中 已编辑。这只是从结果的 rdd 创建一个 DF。 使用给定的代码,我可以将它保存到 hive 中。只是出于好奇,想知道在我不知道年龄最大值的情况下如何找到范围计数(给定年龄跨度范围=10) 这是应用程序逻辑。您可能需要计算最小值/最大值以确定范围。 histogram 方法也可以只取一个数字,它会自己创建范围... (rdd.histogram(10)) 使用 rdd.housing(10) 后,我得到的输出为 Age_range Count 19.0 149 24.6 262 30.2 177 这是错误的

以上是关于存储火花数据框-pyspark的主要内容,如果未能解决你的问题,请参考以下文章

通过火花数据框读取 S3 文件时,胶水书签不起作用

火花数据框密封特征类型

嵌套的json扁平化火花数据框

将相同的功能应用于火花数据框行的所有字段

遍历火花数据框中的列并计算最小值最大值

PySpark:无法创建火花数据框