![](/img/trans.png)
[英]Extract JSON object column to multiple columns in Spark using Java
[英]Extract only certain columns in Java Spark
我有一个包含 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));
我阅读了以下两篇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。 只有我的第 3 个建议在 Java 中有等价物(添加在答案的底部)……尽管 Spark 在 Scala 中确实要好得多:-)
一种方法是执行split
,然后对结果进行模式匹配以选择您想要的列:
peopleRDD.cache().map(_.split(",") match { case Array(a,b,_,_,e) => List(a,b,e) })
另一个(取决于您想要的元素组合)是使用take
和drop
,使用val
避免重复拆分。
peopleRDD.cache().map{ line =>
val parts = line.split(",")
parts.take(2) ++ parts.drop(4)
}
(如果你想要一个List
而不是 RDD 中的每个结果元素的Array
,你可以在split
后添加一个toList
)
事实上,可以使用相同的方法来简化您的原始解决方案,例如:
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]});
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.