В настоящее время я пытаюсь понять, как работает RDD. Например, я хочу подсчитать строки на основе контекста в каком-то объекте RDD. У меня есть некоторые Experince с DataFrames и мой код DF, который имеет, например, колонн A
, B
и, вероятно, некоторые другие столбцы, выглядит так:подсчет строк в rdd зависит от контекста линий, pyspark
df = sqlContext.read.json("filepath")
df2 = df.groupBy(['A', 'B']).count()
Логическая часть этого кода ясно для меня - я groupBy
операция над именем столбца в DF. В 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)
Фактически 'groupBy' не рекомендуется, так как он требует перетасовки разделов, следовательно, перемещение многих данных среди всех узлов. –
@Alberto Bonsanto, благодарю вас за интерес к этой теме. Я не думаю, что groupBy опасен для DF, а для RDD его не существует. – Guforu
Ну, вы можете найти некоторые причины, объясняемые здесь * databricks * здесь [Предпочитаете сокращениеByKey над groupByKey] (https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/best_practices/prefer_reducebykey_over_groupbykey.html) –