2017-08-11 37 views
0

我试图使用scala将spark数据框列的不同值收集到列表中。我曾尝试不同的选择:将spark数据帧列值收集到列表中的快速方法(scala)

  • df.select(columns_name).distinct().rdd.map(r => r(0).toString).collect().toList
  • df.groupBy(col(column_name)).agg(collect_list(col(column_name))).rdd.map(r => r(0).toString).collect().toList

,他们都工作,但我的数据量,这个过程是很缓慢的,所以我试图加快速度。有没有人有我可以尝试的建议?

我使用星火2.1.1

的感谢!

+0

使用'收集()'应该已经是一个集合,但肯定的,因为所有的数据被混洗到你的机器很慢,这不是应该如何使用火星 –

+0

感谢您的答案。我知道“收集”和类似的东西应该尽可能避免,但我恐怕我需要一个.. – vrivesmolina

回答

0

您可以尝试

df.select("colName").dropDuplicates().rdd.map(row =>row(0)).collect.toList 

或者你可以尝试

df.select("colName").dropDuplicates().withColumn("colName", collect_list("colName")).rdd.map(row =>row(0)).collect 
+0

感谢您的建议,但似乎需要大约相同的时间,不幸的是..我已经能够通过直接导入所有可能的案例列表来绕过这个问题(不需要使用df),然后过滤我的表并检查df_after_filter.count()是否等于零 – vrivesmolina

+0

是的解决方案需要相同的时间(更多的可能是)我只是写了替代方法来做逻辑。收集是一个昂贵的,因为它将所有的数据带入驱动程序节点。因此,直到你使用收集方法,速度不会提高。 –

相关问题