簡體   English   中英

如何使用 Spark JavaRDD 將列拆分為多行

[英]How to split column into multiple rows using Spark JavaRDD

加載數據:

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

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

我目前已將此表加載到 RDD 中:

ID 一個 姓名
1 23 50 哈利波特

我想將其轉換為下表:

ID 一個 姓名
1 23 50 哈利
1 23 50 波特

我發現的所有解決方案都使用了我無法使用的 SparkSQL,所以我如何僅使用flatMapmapToPair類的東西來獲得這個結果。

可能是這樣的?

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

上面的代碼產生了這個:

ID 一個 姓名
1 23 50 哈利
波特

我知道在 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)) }

第一部分非常簡單,從 Scala 轉換為 Java,您只需要使用map將每一行用逗號分隔即可得到JavaRDD<String[]> 然后使用flatMap ,對於每一行,拆分與Name對應的數組的最后一部分,並使用 java 流,您可以將名稱列表的每個元素轉換為新列表。

這是一個完整的例子:

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM