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 - 将键与值进行比较的主要内容,如果未能解决你的问题,请参考以下文章
为啥允许将 std::optional 与值进行比较? [复制]
MySQL:为啥将主键与不使用索引的随机生成的数字进行比较?
将字典中具有相同值的所有键组合在一起,并将键与值交换,将值与键交换