pyspark:仅基于 rdd 的操作

Posted

技术标签:

【中文标题】pyspark:仅基于 rdd 的操作【英文标题】:pyspark: rdd based operation only 【发布时间】:2019-11-09 18:24:37 【问题描述】:

我正在尝试仅使用基于 rdd 的操作。我有一个类似的文件;

0, Alpha,-3.9, 4, 2001-02-01, 5, 20
0, Beta,-3.8, 3, 2002-02-01, 6, 21
1, Gamma,-3.7, 8, 2003-02-01, 7, 22
0, Alpha,-3.5, 5, 2004-02-01, 8, 23
0, Alpha,-3.9, 6, 2005-02-01, 8, 27

首先我将数据加载到 rdd 中,如下所示,

rdd = sc.textFile(myDataset)

然后我对每个 raw 中 first elements 的不同元素感兴趣。意思是Alpha, Beta, Gamma。在这种情况下,我期望 3 不同的元素。 这就是我所做的,

coll = [] # to collect the distinct elements
list_ = rdd.collect() # to get the list
for i in list_:
    result = myFun(i) # this function I created to process line by line and return a tuple.
    if result[1] not in coll:
        coll.append(result[1])

有没有更快/更好的方法来做到这一点,只使用基于 rdd 的操作?

【问题讨论】:

【参考方案1】:

您可以将mapdistinct 一起使用,如下所示:

rdd = sc.textFile('path/to/file/input.txt')
rdd.take(10)
#[u'0, Alpha,-3.9, 4, 2001-02-01, 5, 20', u'0, Beta,-3.8, 3, 2002-02-01, 6, 21', u'1, Gamma,-3.7, 8, 2003-02-01, 7, 22', u'0, Alpha,-3.5, 5, 2004-02-01, 8, 23', u'0, Alpha,-3.9, 6, 2005-02-01, 8, 27']

list_ = rdd.map(lambda line: line.split(",")).map(lambda e : e[1]).distinct().collect() 

list_
[u' Alpha', u' Beta', u' Gamma']

【讨论】:

以上是关于pyspark:仅基于 rdd 的操作的主要内容,如果未能解决你的问题,请参考以下文章

如何更改pyspark中的列元数据?

使用 pyspark 过滤数组中基于 RDD 的值

基于 Pyspark 中的键加入 RDD

PySpark,按键交叉

如何在 PySpark 中获得不同的字典 RDD?

Pyspark:基于类型的值操作