Apache spark 按字段对Spark数据帧进行重复数据消除

Apache spark 按字段对Spark数据帧进行重复数据消除,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,假设我有以下spark数据帧: 是否可以通过geohash字段将其复制,然后像这样收集第二个字段的结果 ----------------------- | geohash | timehash | ---------------------- | x | y , z | ----------------------- | z | y | 使用reduceByKey的aggregateByKey可以获得所需的结果。我还没有用您提供的

假设我有以下spark数据帧:

是否可以通过geohash字段将其复制,然后像这样收集第二个字段的结果

 -----------------------
 | geohash | timehash  |
 ---------------------- 
 | x       | y , z     |
 -----------------------
 | z       | y         |

使用
reduceByKey
aggregateByKey
可以获得所需的结果。我还没有用您提供的确切数据测试我的代码。但是,基本代码应该是

val geoHashRdd = geoHashDF.map(row ⇒ (row.geohash, row.timehash)).rdd;
val reduceByKey = geoHashRdd.reduceByKey((a , b) => a.concat(b))


使用
reduceByKey
aggregateByKey
可以获得所需的结果。我还没有用您提供的确切数据测试我的代码。但是,基本代码应该是

val geoHashRdd = geoHashDF.map(row ⇒ (row.geohash, row.timehash)).rdd;
val reduceByKey = geoHashRdd.reduceByKey((a , b) => a.concat(b))


您可以使用
groupBy
aggregate
函数来实现这一点,如下所示

df.groupBy("geohash").agg(collect_list("timehash")).alias("timehash").show

//output
+-------+--------+
|geohash|timehash|
+-------+--------+
|      x|  [y, z]|
|      z|     [y]|
+-------+--------+

您可以使用
groupBy
aggregate
函数来实现这一点,如下所示

df.groupBy("geohash").agg(collect_list("timehash")).alias("timehash").show

//output
+-------+--------+
|geohash|timehash|
+-------+--------+
|      x|  [y, z]|
|      z|     [y]|
+-------+--------+

我们为什么不在这里使用groupByKey?给定用例。那么我们什么时候应该使用它呢?Groupbykey的性能比reducebykey差。是的,你也可以用。是的,我明白了。但是如果这不是一个合适的用例,我们应该在什么时候使用它呢?这就是为什么我们不在这里使用groupByKey?给定用例。那么我们什么时候应该使用它呢?Groupbykey的性能比reducebykey差。是的,你也可以用。是的,我明白了。但是如果这不是一个合适的用例,我们应该在什么时候使用它呢?这就是转换为RDD的点,如下所示,将给出行的RDD以及随后的问题。collect_list返回一个数组,我们必须根据需要处理该数组。很好。仅对下面的内容进行注释如下转换为RDD将给出行的RDD以及随后的问题。collect_list返回一个数组,我们必须根据需要处理该数组。很好。以下仅作评论