spark - 将键与值进行比较

Posted

技术标签:

【中文标题】spark - 将键与值进行比较【英文标题】:spark - compare key with values 【发布时间】:2017-02-27 23:27:22 【问题描述】:

我是从spark开始的,我还没有理解一些概念。

我有一个文件,其名称如下:

foo bar
bar foo

但是 foo 和 bar 之间的关系是一样的。我正在尝试创建一个只有一个关系的rdd

foo bar

我创建了这段代码:

step1 = joined.reduceByKey(lambda x,y: x+';'+y).map(lambda x: (x[0], x[1].split(';'))).sortByKey(True).mapValues(lambda x: sorted(x)).collect()

创建第一个输出,我认为我需要另一个 reduceByKey 来删除前一次迭代的现有值,但我不知道该怎么做。

我的想法正确吗?

【问题讨论】:

你的意思是你的文件中的第二条记录必须被删除,因为它的值已经作为第一条记录中的键存在? 【参考方案1】:

像这样简单的东西怎么样:

>>> sc.parallelize(("foo bar", "bar foo")).map(lambda x: " ".join(sorted(x.split(" ")))).distinct().collect()
['bar foo']

【讨论】:

感谢@santon!我创建了一个函数来解析您建议的行。 #解析文件行 def parseLine(line): #对链接进行排序以避免问题 n1,n2 = ' '.join(sorted(line.split('\t'))).split(' ') return (n1 , n2)【参考方案2】:
from pyspark.sql import functions as f    

rdd = spark.sparkContext.parallelize([('foo', 'bar'), ('bar', 'foo'), ])
df = spark.createDataFrame(rdd, schema=['c1', 'c2'])
df = df.withColumn('c3', f.sort_array(f.array(df['c1'], df['c2'])))
df.show()

# output:
+---+---+----------+
| c1| c2|        c3|
+---+---+----------+
|foo|bar|[bar, foo]|
|bar|foo|[bar, foo]|
+---+---+----------+

使用 DataFrame 更容易

【讨论】:

感谢@zhangtong。我喜欢你的建议。很高兴看到其他方法来做同样的事情。再次感谢!

以上是关于spark - 将键与值进行比较的主要内容,如果未能解决你的问题,请参考以下文章

GoLang基础数据类型---字典

为啥允许将 std::optional 与值进行比较? [复制]

MySQL:为啥将主键与不​​使用索引的随机生成的数字进行比较?

将字典中具有相同值的所有键组合在一起,并将键与值交换,将值与键交换

将字典的键与 List 的值进行比较,并返回所有匹配的值,包括重复值

如何将 Python 字典附加到 Pandas DataFrame,将键与列名匹配