根据行上下文计算 rdd 中的行数,pyspark
count the lines in rdd depended on the lines context, pyspark
我目前正在尝试了解 RDD 的工作原理。例如,我想根据某些 RDD 对象中的上下文计算行数。我对 DataFrames 和我的 DF 代码有一些经验,它有例如列 A
、B
和可能的其他一些列,看起来像:
df = sqlContext.read.json("filepath")
df2 = df.groupBy(['A', 'B']).count()
这段代码的逻辑部分对我来说很清楚 - 我对 DF 中的列名进行 groupBy
操作。在 RDD 中,我没有一些列名,只有相似的行,可以是元组或 Row 对象......我如何计算相似的元组并将其作为整数添加到唯一行?例如我的第一个代码是:
df = sqlContext.read.json("filepath")
rddob = df.rdd.map(lambda line:(line.A, line.B))
我执行映射操作并从键 A
和 B
创建值的元组。唯一行不再有任何键(这是与具有列名的 DataFrame 最重要的区别)。
现在我可以生成这样的东西,但它只计算 RDD 中的总行数。
rddcalc = rddob.distinct().count()
我想要的输出是:
((a1, b1), 2)
((a2, b2), 3)
((a2, b3), 1)
...
PS
我找到了这个问题的个人解决方案。这里:rdd 是初始 rdd,rddlist 是所有行的列表,rddmod 是最终修改的 rdd,因此是解决方案。
rddlist = rdd.map(lambda line:(line.A, line.B)).map(lambda line: (line, 1)).countByKey().items()
rddmod = sc.parallelize(rddlist)
我相信您在这里寻找的是reduceByKey
。这将为您计算每对不同的 (a,b)
行出现的次数。
它看起来像这样:
rddob = df.rdd.map(lambda line: (line.A + line.B, 1))
counts_by_key = rddob.reduceByKey(lambda a,b: a+b)
您现在将拥有以下形式的键值对:
((a,b), count-of-times-pair-appears)
请注意,这仅适用于 A 和 B 是字符串的情况。如果它们是列表,则必须创建一个 "primary key" 类型的对象来执行归约。您不能执行主键是某个复杂对象的 reduceByKey
。
我目前正在尝试了解 RDD 的工作原理。例如,我想根据某些 RDD 对象中的上下文计算行数。我对 DataFrames 和我的 DF 代码有一些经验,它有例如列 A
、B
和可能的其他一些列,看起来像:
df = sqlContext.read.json("filepath")
df2 = df.groupBy(['A', 'B']).count()
这段代码的逻辑部分对我来说很清楚 - 我对 DF 中的列名进行 groupBy
操作。在 RDD 中,我没有一些列名,只有相似的行,可以是元组或 Row 对象......我如何计算相似的元组并将其作为整数添加到唯一行?例如我的第一个代码是:
df = sqlContext.read.json("filepath")
rddob = df.rdd.map(lambda line:(line.A, line.B))
我执行映射操作并从键 A
和 B
创建值的元组。唯一行不再有任何键(这是与具有列名的 DataFrame 最重要的区别)。
现在我可以生成这样的东西,但它只计算 RDD 中的总行数。
rddcalc = rddob.distinct().count()
我想要的输出是:
((a1, b1), 2)
((a2, b2), 3)
((a2, b3), 1)
...
PS
我找到了这个问题的个人解决方案。这里:rdd 是初始 rdd,rddlist 是所有行的列表,rddmod 是最终修改的 rdd,因此是解决方案。
rddlist = rdd.map(lambda line:(line.A, line.B)).map(lambda line: (line, 1)).countByKey().items()
rddmod = sc.parallelize(rddlist)
我相信您在这里寻找的是reduceByKey
。这将为您计算每对不同的 (a,b)
行出现的次数。
它看起来像这样:
rddob = df.rdd.map(lambda line: (line.A + line.B, 1))
counts_by_key = rddob.reduceByKey(lambda a,b: a+b)
您现在将拥有以下形式的键值对:
((a,b), count-of-times-pair-appears)
请注意,这仅适用于 A 和 B 是字符串的情况。如果它们是列表,则必须创建一个 "primary key" 类型的对象来执行归约。您不能执行主键是某个复杂对象的 reduceByKey
。