【问题标题】:pySpark convert a list or RDD element to value (int)pySpark 将列表或 RDD 元素转换为值(int)
【发布时间】:2015-09-09 22:59:01
【问题描述】:

我正在使用 pySpark 对标记化 RDD 中的元素进行计数。 这是元素之一:

('b00004tkvy', ['noah', 'ark', 'activity', 'center', 'jewel', 'case', 'ages', '3', '8', 'victory', 'multimedia'])

我必须计算完整 RDD 中的元素数量。它只返回一个值,作为单个元素列表。

有一个函数可以做到这一点。我使用了这段代码(当然可以更改,但必须保留在一行,即 Return 行):

def countTokens(RDD):
    return RDD.map(lambda x :(1,len(x[1]))).reduceByKey(lambda x,y:x+y).map(lambda x: int(x[1])).collect()

print countTokens(aRecToToken)

print countTokens(bRecToToken)

totalTokens = countTokens(aRecToToken) + countTokens(bRecToToken)

结果是:

[167]
[58]
There are [167, 58] tokens.

此时我不知道如何将结果用作值(整数)而不是列表。 我的目标 id 得到

167
58    
There are 225 tokens.

我希望有人可以帮助我。

提前谢谢你。

【问题讨论】:

  • 所有这些lambdas 使您的代码不可读。您的实际问题很容易解决,但如果您编写更明显/可维护的代码,您可能会理解它。
  • 所以在第一张地图中,您松开了钥匙。这让我想知道你为什么要使用 reduceByKey 而不是 reduce。
  • 这可能是 edx 板本身的最佳答案.....
  • 非常感谢你们。你的提示帮助我解决了这个问题。 @Justin,在 edx 板上不喜欢代码。

标签: python apache-spark tokenize rdd pyspark


【解决方案1】:
def countTokens(RDD):
    return RDD.map(lambda x :(1,len(x[1])))
              .reduceByKey(lambda x,y:x+y)
              .map(lambda x: int(x[1])).collect()[0]

当您需要此 225 中的值时,该值将返回一个列表。添加 [0] 将为您提供列表中的第零项,您可以从中获取总数。

但你真的不需要

x:(1, 

如果你所做的一切都是总计,那么你只需要 len(x[1]) 然后像你所做的那样减少

【讨论】:

    猜你喜欢
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多