存储火花数据框-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的主要内容,如果未能解决你的问题,请参考以下文章