从 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))
很想知道你的发现。
我正在使用 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))
很想知道你的发现。