java—如何使用spark javardd将列拆分为多行

798qvoo8  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(394)

加载数据:

SparkConf sc= new SparkConf().setAppName("TEST").setMaster("local[*]");
JavaSparkContext JSC = new JavaSparkContext(sc);

JavaRDD<String> stringRDDVotes = JSC.textFile("HarryPotter.csv");

我当前已将此表加载到rdd中:
idabname12350harry;波特
我想把它转换成下表:
idabname12350harry12350potter公司
我找到的所有解决方案都使用我不能使用的sparksql,那么我如何只使用 flatMap 以及 mapToPair .
像这样的可能?

flatMap(s -> Arrays.asList(s.split(";")).iterator())

上面的代码生成:
idabname12350harrypotter公司
我知道在scala中可以这样做,但我不知道如何使用java:

val input: RDD[String] = sc.parallelize(Seq("1,23,50,Harry;Potter"))
val csv: RDD[Array[String]] = input.map(_.split(','))

val result = csv.flatMap { case Array(s1, s2, s3, s4) => s4.split(";").map(part => (s1, s2, s3, part)) }
wz3gfoph

wz3gfoph1#

第一部分很容易从scala转换到java,您只需要使用 map 用逗号分隔每行以得到 JavaRDD<String[]> . 然后使用 flatMap ,对于每一行,拆分对应于 Name ,并使用java流,可以将names列表的每个元素转换为新的列表。
下面是一个完整的示例:

JavaRDD<String> input = JSC.parallelize(
        Arrays.asList("1,23,50,Harry;Potter", "2,24,60,Hermione;Granger")
);

JavaRDD<String[]> result = input.map(line -> line.split(","))
        .flatMap(r -> {
            List<String> names = Arrays.asList(r[3].split(";"));

            String[][] values = names.stream()
                    .map(name -> new String[]{r[0], r[1], r[2], name})
                    .toArray(String[][]::new);

            return Arrays.asList(values).iterator();
        });

// print the result RDD
for (String[] line : result.collect()) {
    System.out.println(Arrays.toString(line));
}
// [1, 23, 50, Harry]
// [1, 23, 50, Potter]
// [2, 24, 60, Hermione]
// [2, 24, 60, Granger]

相关问题