Python 使用PySpark将行元组数组缩减为其唯一值
设置数据帧:Python 使用PySpark将行元组数组缩减为其唯一值,python,python-3.x,apache-spark,pyspark,Python,Python 3.x,Apache Spark,Pyspark,设置数据帧: data = [ (Row(id='label1'), Row(id='label1')), (Row(id='label1'), Row(id='label6')), (Row(id='label6'), Row(id='label1')), (Row(id='label6'), Row(id='label6'))] df = sc.parallelize(data) df.collect() 返回: [(Row(id='label1'), Row(id='labe
data = [
(Row(id='label1'), Row(id='label1')),
(Row(id='label1'), Row(id='label6')),
(Row(id='label6'), Row(id='label1')),
(Row(id='label6'), Row(id='label6'))]
df = sc.parallelize(data)
df.collect()
返回:
[(Row(id='label1'), Row(id='label1')),
(Row(id='label1'), Row(id='label6')),
(Row(id='label6'), Row(id='label1')),
(Row(id='label6'), Row(id='label6'))]
[Row(id='label6'), Row(id='label1')]
File "<ipython-input-39-dffaf6bcbb80>", line 12
df.groupByKey() .flatMap(lambda (x,y): fn(x,y)) .map(lambda r: tuple(sorted(r))) .distinct() .take(5)
^
SyntaxError: invalid syntax
File "<ipython-input-302-dd76d08c9530>", line 12
df.groupByKey().flatMap(lambda (x,y): fn(x,y)).map(lambda r: tuple(sorted(r))).distinct().take(5)
^
SyntaxError: invalid syntax
此数据集被缩减,实际数据集包含更多的标签。我正在尝试删除重复项。要从中删除重复项,请执行以下操作:
[(Row(id='label1'), Row(id='label1')),
(Row(id='label1'), Row(id='label6')),
(Row(id='label6'), Row(id='label1')),
(Row(id='label6'), Row(id='label6'))]
应退还以下文件:
[(Row(id='label1'), Row(id='label6'))]
因此,包含相同标签的行将被删除,或者其他元组位置的相同标签将被删除
最接近我的是:
df.map(lambda k : k[0]).toDF().distinct().collect()
返回:
[(Row(id='label1'), Row(id='label1')),
(Row(id='label1'), Row(id='label6')),
(Row(id='label6'), Row(id='label1')),
(Row(id='label6'), Row(id='label6'))]
[Row(id='label6'), Row(id='label1')]
File "<ipython-input-39-dffaf6bcbb80>", line 12
df.groupByKey() .flatMap(lambda (x,y): fn(x,y)) .map(lambda r: tuple(sorted(r))) .distinct() .take(5)
^
SyntaxError: invalid syntax
File "<ipython-input-302-dd76d08c9530>", line 12
df.groupByKey().flatMap(lambda (x,y): fn(x,y)).map(lambda r: tuple(sorted(r))).distinct().take(5)
^
SyntaxError: invalid syntax
但是这是一个行数组而不是行元组数组:[(Row(id='label6'),Row(id='label1'))]
更新:
每一行还包含一个SparseVector,为了集中讨论这个问题,我省略了它。对每一行的SparseVector
行执行比较函数label1,label1
和label6,label6
不进行比较,因为它们包含相同的标签。label1、label6
或label6、label1
不进行比较,因为比较label1、label6和label6,label1将返回相同的值
更新2:
data = [
(Row(id='label1'), Row(id='label1')),
(Row(id='label1'), Row(id='label6')),
(Row(id='label6'), Row(id='label1')),
(Row(id='label6'), Row(id='label6'))
(Row(id='label6'), Row(id='label2'))
(Row(id='label3'), Row(id='label3'))]
应该回来
data = [
(Row(id='label1'), Row(id='label6'))
(Row(id='label6'), Row(id='label2'))]
更新3:
from pyspark.sql import Row
data = [(Row(id='label1'), Row(id='label1')),
(Row(id='label1'), Row(id='label6')),
(Row(id='label6'), Row(id='label1')),
(Row(id='label6'), Row(id='label6')),
(Row(id='label6'), Row(id='label2')),
(Row(id='label3'), Row(id='label3'))]
df = sc.parallelize(data)
df.groupByKey()\
.flatMap(lambda (x,y): fn(x,y))\
.map(lambda r: tuple(sorted(r)))\
.distinct()\
.take(5)
[(Row(id='label2'), Row(id='label6')),
(Row(id='label1'), Row(id='label6'))]
返回:
[(Row(id='label1'), Row(id='label1')),
(Row(id='label1'), Row(id='label6')),
(Row(id='label6'), Row(id='label1')),
(Row(id='label6'), Row(id='label6'))]
[Row(id='label6'), Row(id='label1')]
File "<ipython-input-39-dffaf6bcbb80>", line 12
df.groupByKey() .flatMap(lambda (x,y): fn(x,y)) .map(lambda r: tuple(sorted(r))) .distinct() .take(5)
^
SyntaxError: invalid syntax
File "<ipython-input-302-dd76d08c9530>", line 12
df.groupByKey().flatMap(lambda (x,y): fn(x,y)).map(lambda r: tuple(sorted(r))).distinct().take(5)
^
SyntaxError: invalid syntax
返回:
[(Row(id='label1'), Row(id='label1')),
(Row(id='label1'), Row(id='label6')),
(Row(id='label6'), Row(id='label1')),
(Row(id='label6'), Row(id='label6'))]
[Row(id='label6'), Row(id='label1')]
File "<ipython-input-39-dffaf6bcbb80>", line 12
df.groupByKey() .flatMap(lambda (x,y): fn(x,y)) .map(lambda r: tuple(sorted(r))) .distinct() .take(5)
^
SyntaxError: invalid syntax
File "<ipython-input-302-dd76d08c9530>", line 12
df.groupByKey().flatMap(lambda (x,y): fn(x,y)).map(lambda r: tuple(sorted(r))).distinct().take(5)
^
SyntaxError: invalid syntax
文件“”,第12行
df.groupByKey().flatMap(lambda(x,y):fn(x,y)).map(lambda r:tuple(sorted(r))).distinct().take(5)
^
SyntaxError:无效语法
请查看这是否适合您
这是你的数据
data = [(Row(id='label1'), Row(id='label1')),
(Row(id='label1'), Row(id='label6')),
(Row(id='label6'), Row(id='label1')),
(Row(id='label6'), Row(id='label6')),
(Row(id='label6'), Row(id='label2')),
(Row(id='label3'), Row(id='label3'))]
df = sc.parallelize(data)
以下内容将提供您想要的:
def fn(k, rl):
fil=[]
for row in rl:
if row != k:
fil.append((k, row))
return fil
df.groupByKey()\
.flatMap(lambda (x,y): fn(x,y))\
.map(lambda r: tuple(sorted(r)))\
.distinct()\
.take(5)
[(Row(id='label2'), Row(id='label6')),
(Row(id='label1'), Row(id='label6'))]
希望这对您有所帮助请查看这是否适合您 这是你的数据
data = [(Row(id='label1'), Row(id='label1')),
(Row(id='label1'), Row(id='label6')),
(Row(id='label6'), Row(id='label1')),
(Row(id='label6'), Row(id='label6')),
(Row(id='label6'), Row(id='label2')),
(Row(id='label3'), Row(id='label3'))]
df = sc.parallelize(data)
以下内容将提供您想要的:
def fn(k, rl):
fil=[]
for row in rl:
if row != k:
fil.append((k, row))
return fil
df.groupByKey()\
.flatMap(lambda (x,y): fn(x,y))\
.map(lambda r: tuple(sorted(r)))\
.distinct()\
.take(5)
[(Row(id='label2'), Row(id='label6')),
(Row(id='label1'), Row(id='label6'))]
希望这有帮助@蓝天,你为什么要丢掉这张唱片?(Row(id='label3')、Row(id='label3')、label3没有出现在任何地方?@Rags我正在删除该记录,因为它在两个元组位置上的id相同。@蓝天,为什么要删除该记录?(Row(id='label3')、Row(id='label3')),label3没有出现在任何地方?@Rags我正在删除该记录,因为它在两个元组位置上的id相同。谢谢,但这失败了,请查看问题更新。这对Python3适用吗?很抱歉,忘记添加函数定义。请现在检查。同样可以通过单一方式“df.filter”(lambda x:x[0]!=x[1])实现。map(已排序).map(tuple).distinct().take(5)与用户6910411提到的一样您做了什么更改?我尝试了更新的代码,但出现了错误,请参阅有问题的更新4。是的,它确实显示为“df.filter(lambda x:x[0]!=x[1])。map(已排序).map(tuple).distinct().take(5)'还可以工作更改正在添加函数定义谢谢,但这失败了,请参阅问题更新。这对您使用Python3有效吗?很抱歉,忘记添加函数定义。请立即检查。这可以通过单一方式实现'df.filter(lambda x:x[0]!=x[1])。map(排序)。map(元组)。distinct()。take(5)'like user6910411提到您更改了什么?我尝试了您的更新代码,但出现了错误,请参阅有问题的更新4。是的,它确实出现'df.filter(lambda x:x[0]!=x[1]).map(sorted).map(tuple).distinct().take(5)'同样有效。更改正在添加函数定义