gpt4 book ai didi

java - 仅提取 Java Spark 中的某些列

转载 作者:行者123 更新时间:2023-11-30 07:25:15 25 4
gpt4 key购买 nike

我有一个包含 10 列的文件。仅提取前 3 列或特定列的最优雅的方法是什么?

例如,我的文件如下所示:

john,smith,84,male,kansas
john,doe,48,male,california
tim,jones,22,male,delaware

我想提取到这个:

[john, smith, kansas]
[john, doe, california]
[tim, jones, delaware]

我拥有的是这个,但它没有专门选择我想要的列:

JavaRDD<String> peopleRDD = sc.textFile(DATA_FILE);
peopleRDD.cache().map(lines -> Arrays.asList(lines.split(",")))
.forEach(person -> LOG.info(person));

我读了following two Stackoverflow 发布了帖子,但我仍然无法决定如何执行此操作。

编辑:我最终做了以下事情:

JavaRDD<String> peopleRDD = sc.textFile(DATA_FILE);
peopleRDD.cache().map(lines -> Arrays.asList(new String[]{lines.split(",")[0],
lines.split(",")[1],
lines.split(",")[3]}
.forEach(person -> LOG.info(person));

这不是最优雅的解决方案,但如果您有更好的方法,请在此处发布。谢谢。

最佳答案

编辑:抱歉,我刚刚意识到您正在寻求 Java 解决方案,但我使用了 Scala。我的建议中只有第三个在 Java 中具有等效项(添加在答案的底部)...Spark 在 Scala 中确实要好得多:-)

一种方法是执行拆分,然后对结果进行模式匹配以选择所需的列:

peopleRDD.cache().map(_.split(",") match { case Array(a,b,_,_,e) => List(a,b,e) }) 

另一种(取决于您想要的元素组合)是使用 takedrop,使用 val 避免重复拆分。

peopleRDD.cache().map{ line => 
val parts = line.split(",")
parts.take(2) ++ parts.drop(4)
}

(如果您想要一个 List 而不是 Array ,您可以在 split 之后添加一个 toList RDD 中的每个结果元素)

事实上,可以使用相同的方法来简化原始解决方案,例如:

peopleRDD.cache().map{ line => 
val parts = line.split(",")
List(parts[0], parts[1], parts[4])
}

在 Java8 中,您可能可以执行相同的操作,这是一个微小的改进,因为我们避免了重复调用 split - 类似于:

peopleRDD.cache().map( line -> {
Array<String> parts = line.split(",");
Arrays.asList(new String[]{parts[0], parts[1], parts[4]});
})

关于java - 仅提取 Java Spark 中的某些列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36898090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com