java - Java中spark实现中映射形成键/值对

标签 java apache-spark dataset

我有一个数据集,我将从文件中读取该数据集,

1 2 3 4 5:9:3 2 1 2 1
2 3 5:4:1 2 1
4 5:3:1 2

我试图将它们与每一行分开,然后使用冒号的左侧部分和相应的冒号的右侧部分创建一个键/值。例如,在第一行中,13 映射为 (1,3)22 映射为 (2,2)。同样,第一行将有 (3,1), (4,2), (5,1)。同样,它应该生成第二行和第三行。

到目前为止,我已尝试使用映射函数分割每一行,然后尝试通过将每个左侧部分项与相应的右侧部分值映射来创建元组。

到目前为止的代码:

   JavaRDD<List<String>> transactions = data.map(
                new Function<String, List<String>>() {
                    public List<String> call(String line) {
                        String[] parts = line.split(" ");
                        return Arrays.asList(parts);
                    }
                }
        );

   JavaPairRDD<String, Integer> ones = transactions.mapToPair(
                new PairFunction<List<String>, String, Integer>() {
                    public Tuple2<String, Integer> call(List<String> w) {

                        return new Tuple2<String, Integer>....;
                    }
                });

我对返回部分感到震惊。有什么方法可以获取所有键/值对吗?

PS:我是 apache Spark 的新手。

最佳答案

您可以使用flatmap相对更优雅的解决方案:

val res = dataset.flatMap(line => {
    val f = line.split(":", -1) //taking care of the empty values with -1
    val keys = f(0).split(" ", -1)
    val values = f(2).split(" ", -1)
    keys.zip(values) //List[(String, String)], (key, value) pairs for a line
})

res.collect.map(println)

(1,3)
(2,2)
(3,1)
(4,2)
(5,1)
(2,1)
(3,2)
(5,1)
(4,1)
(5,2)

关于java - Java中spark实现中映射形成键/值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40982668/

相关文章:

java - Android下使用Logger进行日志记录

apache-spark - 设置 PYSPARK_SUBMIT_ARGS 会导致创建 SparkContext 失败

scala - Spark 上的数据分析 Scala

apache-spark - Apache Spark 的非确定性来源

javascript - 如何在 JavaScript 中创建和查看数据集

ado.net - DataSet.AcceptChanges() 不起作用

mysql - 如何在 SQL 中进行嵌套查询

Java 1.6 : Pass generic interface to generic class

java - 在 Spring 中使用 SimpleJdbcCall 调用返回行的 Oracle 过程

java - 如何正确关闭java-ee websocket连接