从 Spark 2.0 中的逗号分隔字符串行中获取不同的项目

Get distinct items from rows of comma separated strings in Spark 2.0

我正在使用 Spark 2.0 分析数据集。一列包含这样的字符串数据:

A,C
A,B
A
B
B,C

我想得到一个 JavaRDD,其中包含列中出现的所有不同项目,如下所示:

A
B
C 

如何在 spark 中有效地完成这项工作?我将 Spark 与 Java 一起使用,但 Scala 示例或指针会很有用。

编辑: 我试过使用 flatMap,但我的实现速度很慢。

JavaRDD<String> d = dataset.flatMap(s -> Arrays.asList(s.split(",")).iterator())

尝试使用:

1) 爆炸:https://spark.apache.org/docs/2.0.0/api/java/ org.apache.spark.sql.functions.explode(列列)

static Column   explode(Column e)

分解 - 为给定数组或映射列中的每个元素创建一个新行。

2) 然后在这一列执行"distinct":

http://spark.apache.org/docs/latest/programming-guide.html

distinct([numTasks])) Return 包含源数据集不同元素的新数据集。

总结

分解将导致每行一个项目(在此特定列中)。

Distinct 将只留下不同的项目

我不确定 "slow" 是什么意思。大概你有一个非常大的数据集(否则你不需要 Spark)所以 "slow" 是相对的。但是,我只会做

dataset.flatMap(s -> s.split(",")).distinct

我知道很长,但是如果你想完全在执行者节点而不是工作节点上完成执行,请试试这个。

dataset
.flatMap(x => x.split(","))
.map(x => (x,1))
.sortByKey()
.reduceByKey(_+_)
.map(x=>x._1)

如果您遇到数据格式错误,请添加此内容:

dataset.map(x=>(x._1+","+x._2+","+x._3))

很想知道你的发现。