我想弄清楚为什么我的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()
答案 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()的另一篇不错的文章