我有一个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()
谢谢
答案 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 :(得分: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效果很好