Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用PySpark将行元组数组缩减为其唯一值_Python_Python 3.x_Apache Spark_Pyspark - Fatal编程技术网

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)'同样有效。更改正在添加函数定义