簡體   English   中英

如何使用具有多個值的 rdd.map/groupByKey?

[英]How do I use rdd.map/groupByKey with multiple values?

我目前正在學習 pyspark,但我不太了解在 groupByKey() 中使用多個值的語法。 假設我想在(Category, Quantity)的模式中找到數量最多的產品類別,這似乎很簡單。 我可以:

itemQuantity = df.rdd.map(lambda x: (x[0],x[1]))
highestQuantity = itemQuantity.groupByKey()
                  .map(lambda x: (x[0], sum(x[1])))
                  .top(1, key = lambda x: x[1])

但是假設我有一個(類別、價格、數量)的模式並且必須找到每個類別中的平均項目成本,我該怎么做呢? 從概念上講,我知道我首先必須 groupByKey() 來實現類似(Category, [Price, Quantity])的東西,因為 groupByKey() 似乎不適用於 3 個值(ValueError: too many values to unpack (expected 2 )。 當我做:

averageCost = df.rdd.map(lambda x: (x[0], (x[1], x[2])))
aC = averageCost.groupByKey()

我最終得到了一個我不確定如何操作的數據框,因為它有兩個元組。

[('Category_1', <pyspark.resultiterable.ResultIterable object at 0x7fb812b5ef70>), ... ,('Category_n', <pyspark.resultiterable.ResultIterable object at 0x7fb812b5fb50>)]

理想情況下,我希望得到類似(Category, sum(Price), sum(Quantity))的結果。 我將如何實現這一目標? 我一直在兩個單獨的模式(類別,價格)(類別,數量)上使用 reduceByKey(),盡管這遠非理想。 還有什么備忘單可以讓初學者了解語法嗎? 我瀏覽了很多示例和文檔,但我發現它們通常過於抽象而無法理解。

您是否有任何特定原因要使用 rdd 函數而不是數據幀一,因為在您的情況下,這樣寫起來會更容易

from pyspark.sql.functions import sum
 df.groupBy("Category").agg(sum("Price"),sum("Quantity"))

這好像是

priceAndQuantity = df.rdd.map(lambda x: (x[0], (x[1], x[2])))
PAQ1 = priceAndQuantity.reduceByKey(lambda v1,v2: (v1[0] + v2[0], v1[1] + v2[1]))
PAQ2 = PAQ1.map(lambda x: (x[0], x[1][0], x[1][1]))

做我希望做的事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM