PySpark groupByKey返回pyspark.resultiterable.ResultIterable

时间:2015-04-18 12:18:50

标签: python apache-spark pyspark

我想弄清楚为什么我的groupByKey会返回以下内容:

[(0, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a210>), (1, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a4d0>), (2, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a390>), (3, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a290>), (4, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a450>), (5, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a350>), (6, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a1d0>), (7, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a490>), (8, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a050>), (9, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a650>)]

我有flatMapped值,如下所示:

[(0, u'D'), (0, u'D'), (0, u'D'), (0, u'D'), (0, u'D'), (0, u'D'), (0, u'D'), (0, u'D'), (0, u'D'), (0, u'D')]

我做的很简单:

groupRDD = columnRDD.groupByKey()

6 个答案:

答案 0 :(得分:60)

您回来的是一个允许您迭代结果的对象。您可以通过调用值上的list()将groupByKey的结果转换为列表,例如

example = sc.parallelize([(0, u'D'), (0, u'D'), (1, u'E'), (2, u'F')])

example.groupByKey().collect()
# Gives [(0, <pyspark.resultiterable.ResultIterable object ......]

example.groupByKey().map(lambda x : (x[0], list(x[1]))).collect()
# Gives [(0, [u'D', u'D']), (1, [u'E']), (2, [u'F'])]

答案 1 :(得分:19)

您也可以使用

package io.biddleinc.casacontroller;


import android.app.SearchManager;
import android.content.Intent;
import android.os.Bundle;
import org.apache.cordova.*;

public class HelloCordova extends CordovaActivity 
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        super.init();

        Intent intent = getIntent();
        String url = "file:///android_asset/www/login_full.html";
        if (Intent.ACTION_SEARCH.equals(intent.getAction())
                || "com.google.android.gms.actions.SEARCH_ACTION".equals(intent.getAction())) {
            url += "?search=" + intent.getStringExtra(SearchManager.QUERY);
        }   
        super.loadUrl(url);
        // Set by <content src="index.html" /> in config.xml
        //super.loadUrl(Config.getStartUrl());
        //super.loadUrl("file:///android_asset/www/index.html");
    }

    @Override
    protected void onNewIntent(Intent intent)
    {
        //super.onNewIntent(intent);

        if (Intent.ACTION_SEARCH.equals(intent.getAction())
               || "com.google.android.gms.actions.SEARCH_ACTION".equals(intent.getAction())) {
        String phrase = intent.getStringExtra(SearchManager.QUERY);
        String url = "javascript: { recongizeSpeechFromGoogle('"+ phrase + "'); }";
        super.loadUrl(url);

        }

        //Forward to plugins
        if (this.appView != null)
           this.appView.onNewIntent(intent);
    }


}

答案 2 :(得分:1)

我建议您使用cogroup()而不是使用groupByKey()。您可以参考以下示例。

[(x, tuple(map(list, y))) for x, y in sorted(list(x.cogroup(y).collect()))]

示例:

>>> x = sc.parallelize([("foo", 1), ("bar", 4)])
>>> y = sc.parallelize([("foo", -1)])
>>> z = [(x, tuple(map(list, y))) for x, y in sorted(list(x.cogroup(y).collect()))]
>>> print(z)

你应该得到所需的输出......

答案 3 :(得分:1)

示例:

r1 = sc.parallelize([('a',1),('b',2)])
r2 = sc.parallelize([('b',1),('d',2)])
r1.cogroup(r2).mapValues(lambda x:tuple(reduce(add,__builtin__.map(list,x))))

结果:

[('d', (2,)), ('b', (2, 1)), ('a', (1,))]

答案 4 :(得分:0)

除了以上答案外,如果您想要唯一项目的排序列表,请使用以下内容:

不同值和排序值列表

example.groupByKey().mapValues(set).mapValues(sorted)

仅是排序值列表

example.groupByKey().mapValues(sorted)

以上替代名称

# List of distinct sorted items
example.groupByKey().map(lambda x: (x[0], sorted(set(x[1]))))

# just sorted list of items
example.groupByKey().map(lambda x: (x[0], sorted(x[1])))

答案 5 :(得分:0)

说您的代码是..

ex2 = ex1.groupByKey()

然后运行。.

ex2.take(5)

您将看到一个迭代。没关系,如果您要对这些数据进行处理,则可以继续。但是,如果您只想在继续操作之前先打印/查看这些值,那么这有点麻烦了。

ex2.toDF().show(20, False)

或者只是

ex2.toDF().show()

这将显示数据值。您不应该使用collect(),因为那样会将数据返回给驱动程序,并且如果您要处理大量数据,那将会给您带来极大的麻烦。现在,如果ex2 = ex1.groupByKey()是您的最后一步,并且您希望返回这些结果,那么可以使用collect(),但是请确保您知道返回的数据量很小。

print(ex2.collect())

这是在RDD上使用collect()的另一篇不错的文章

View RDD contents in Python Spark?