如何在Spark中查找多个列的不同值

时间:2019-06-02 11:28:51

标签: apache-spark pyspark

我有一个RDD,我想为多个列查找不同的值。

示例:

Row(col1=a, col2=b, col3=1), Row(col1=b, col2=2, col3=10)), Row(col1=a1, col2=4, col3=10)

我想找到一张地图:

col1=[a,b,a1]
col2=[b,2,4]
col3=[1,10]

数据框可以帮助更快或更简单地计算它吗?

更新:

我对RDD的解决方案是:


def to_uniq_vals(row):
   return [(k,v) for k,v in row.items()]

rdd.flatMap(to_uniq_vals).distinct().collect()

谢谢

3 个答案:

答案 0 :(得分:1)

希望我能正确理解你的问题; 您可以尝试以下操作:

import org.apache.spark.sql.{functions => F}
val df = Seq(("a", 1, 1), ("b", 2, 10), ("a1", 4, 10))
df.select(F.collect_set("_1"), F.collect_set("_2"), F.collect_set("_3")).show

结果:

+---------------+---------------+---------------+
|collect_set(_1)|collect_set(_2)|collect_set(_3)|
+---------------+---------------+---------------+
|     [a1, b, a]|      [1, 2, 4]|        [1, 10]|
+---------------+---------------+---------------+

上面的代码应该比预定的select distinct更有效率 逐列的原因有几个:

  1. 较少的工人主持往返行程。
  2. 在同事之间进行重复数据删除之前,应在本地对员工进行重复数据删除。

希望有帮助!

答案 1 :(得分:0)

也许是因为如果我正确理解了您的问题,则可以将其转换为数据框并从每一列中获取不同的值。

>>> rdd.collect()
[Row(col1='a', col2='b', col3=1), Row(col1='b', col2=2, col3=10), Row(col1='a1', col2=4, col3=10)]
>>> df=rdd.toDF()
19/06/02 18:13:25 WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   a|   b|   1|
|   b|   2|  10|
|  a1|   4|  10|
+----+----+----+

>>> df.select(df['col1']).distinct().show()
+----+
|col1|
+----+
|  a1|
|   b|
|   a|
+----+

>>> df.select(df['col2']).distinct().show()
+----+
|col2|
+----+
|   b|
|   4|
|   2|
+----+

>>> df.select(df['col3']).distinct().show()
+----+
|col3|
+----+
|   1|
|  10|
+----+

答案 2 :(得分:0)

您可以使用拖放重复项,然后选择相同的列。可能不是最有效的方法,但仍然是一种体面的方法:

df.dropDuplicates("col1","col2", .... "colN").select("col1","col2", .... "colN").toJSON

** 使用Scala效果很好