Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.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
Apache spark 我如何通过[";x";,";y";]删除重复项,而不洗牌已由";分区的spark数据帧;x";_Apache Spark_Pyspark - Fatal编程技术网

Apache spark 我如何通过[";x";,";y";]删除重复项,而不洗牌已由";分区的spark数据帧;x";

Apache spark 我如何通过[";x";,";y";]删除重复项,而不洗牌已由";分区的spark数据帧;x";,apache-spark,pyspark,Apache Spark,Pyspark,我有一个spark数据帧,它已经被x列重新分区: df2 = df1.reparition("x") 我希望在不进行洗牌的情况下,通过x和另一列删除重复项,因为在这种特殊情况下洗牌非常长 df3 = df2.dropDuplicates(subset=["x","y"]) 编辑:很明显,dropDuplicates的现有实现不支持非洗牌。假设数据最近被x分区,有没有办法在y上使用sql窗口函数实现类似的结果。我认为会发生洗牌,但只会执行重新分区(“x”)。随后的dropDuplicates(

我有一个spark数据帧,它已经被x列重新分区:

df2 = df1.reparition("x")
我希望在不进行洗牌的情况下,通过x和另一列删除重复项,因为在这种特殊情况下洗牌非常长

df3 = df2.dropDuplicates(subset=["x","y"])

编辑:很明显,dropDuplicates的现有实现不支持非洗牌。假设数据最近被x分区,有没有办法在y上使用sql窗口函数实现类似的结果。

我认为会发生洗牌,但只会执行
重新分区(“x”)
。随后的
dropDuplicates()
将按
key=[“x”,“y”]
对分区进行排序,然后对每个键的第一行进行聚合。由于
x
的所有行都已在一个分区中,因此不需要额外的洗牌

更新

让我们运行一个快速测试:

[user@gateway ~]# pyspark
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.4.0-cdh6.x-SNAPSHOT
      /_/

Using Python version 2.7.5 (default, Apr  9 2019 14:30:50)
SparkSession available as 'spark'.

>>> df1 = spark.createDataFrame([{'x': 1, 'y': 1, 'z': 1},{'x': 1, 'y': 1, 'z': 2},{'x': 1, 'y': 2, 'z': 2},{'x': 2, 'y': 1, 'z': 1}])
>>> df1.printSchema()
root
 |-- x: long (nullable = true)
 |-- y: long (nullable = true)
 |-- z: long (nullable = true)

>>> df2 = df1.repartition("x")
>>> df3 = df2.dropDuplicates(subset=["x","y"])
>>> df3.explain()
== Physical Plan ==
*(1) HashAggregate(keys=[x#0L, y#1L], functions=[first(z#2L, false)])
+- *(1) HashAggregate(keys=[x#0L, y#1L], functions=[partial_first(z#2L, false)])
   +- Exchange hashpartitioning(x#0L, 200)
      +- Scan ExistingRDD[x#0L,y#1L,z#2L]

>>> df3.show()
+---+---+---+
|  x|  y|  z|
+---+---+---+
|  1|  2|  2|
|  1|  1|  1|
|  2|  1|  1|
+---+---+---+

>>>

该计划显示单个
Exchange
操作符(在
x
上洗牌),然后在给定分区上操作
HashAggregate
s,首先为每个
x,y
对获取
partial_
,并获取第一行(甚至没有排序)

我认为洗牌会发生,但只会执行
重新分区(“x”)
。随后的
dropDuplicates()
将按
key=[“x”,“y”]
对分区进行排序,然后对每个键的第一行进行聚合。由于
x
的所有行都已在一个分区中,因此不需要额外的洗牌

更新

让我们运行一个快速测试:

[user@gateway ~]# pyspark
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.4.0-cdh6.x-SNAPSHOT
      /_/

Using Python version 2.7.5 (default, Apr  9 2019 14:30:50)
SparkSession available as 'spark'.

>>> df1 = spark.createDataFrame([{'x': 1, 'y': 1, 'z': 1},{'x': 1, 'y': 1, 'z': 2},{'x': 1, 'y': 2, 'z': 2},{'x': 2, 'y': 1, 'z': 1}])
>>> df1.printSchema()
root
 |-- x: long (nullable = true)
 |-- y: long (nullable = true)
 |-- z: long (nullable = true)

>>> df2 = df1.repartition("x")
>>> df3 = df2.dropDuplicates(subset=["x","y"])
>>> df3.explain()
== Physical Plan ==
*(1) HashAggregate(keys=[x#0L, y#1L], functions=[first(z#2L, false)])
+- *(1) HashAggregate(keys=[x#0L, y#1L], functions=[partial_first(z#2L, false)])
   +- Exchange hashpartitioning(x#0L, 200)
      +- Scan ExistingRDD[x#0L,y#1L,z#2L]

>>> df3.show()
+---+---+---+
|  x|  y|  z|
+---+---+---+
|  1|  2|  2|
|  1|  1|  1|
|  2|  1|  1|
+---+---+---+

>>>

该计划显示单个
Exchange
操作符(在
x
上洗牌),然后在给定分区上操作
HashAggregate
s,首先为每个
x,y
对获取
partial_
,并获取第一行(甚至没有排序)

您是否可以共享显示与
dropDuplicates
相关的随机播放的
explain
?您是否可以共享显示与
dropDuplicates
相关的随机播放的
explain
?我确认此答案正确。在更大范围内,我得到了SortMergeJoin(x)和SortAggregate([x,y]),我确认这个答案是正确的。在更大范围内,我得到了SortMergeJoin(x)和SortAggregate([x,y])