在Spark中使用Java将一列拆分为多列

thtygnil  于 2022-11-27  发布在  Java
关注(0)|答案(1)|浏览(215)

我想用Java在Spark中从一个列创建多个列。我已经尝试了多种方法,包括question given in scala的答案,但我似乎不能使它在Java中工作。
例如,我有一个很长的序列列(大约100):

+---------------------------------+
|                data             |
+---------------------------------+
|1111:1111:1111:2222:6666:1111....|
|ABC2:XYZ2:GDH2:KLN2:JUL2:HAI2....|
+---------------------------------+

我尝试使用IntStream.range(0,16)在Java中复制答案,但它不起作用。
我尝试过的一个不起作用的例子是:df.withColumn("temp", IntStream.range(0,100).map(i->split(col("temp"),":").getItem(i).as(col("col"+i))));我使用了上面的一个变体,但从来没有让它工作。
我想得到这个输出:

+-------------------------------------------+
|col1|col2|col3|col4|col5|col6|col...|col100|
+-------------------------------------------+
|1111|1111|1111|2222|6666|1111|......| 9999 |
|ABC2|XYZ2|GDH2|KLN2|JUL2|HAI2|......| PAHD |
+-------------------------------------------+

在这上面的for循环非常慢,所以不可行。

  • 谢谢-谢谢
vybvopom

vybvopom1#

对于遇到类似问题的任何人,解决方案是使用IntStream,将每个列Map为一个对象,最后将其转换为列列表。
下面是答案:

import scala.collection.JavaConverters;
import java.util.List;
import org.apache.spark.sql.Column;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

List<Column> c = IntStream.range(0, 100).mapToObj(i->col("data").getItem(i).as("col"+i)).sequential().collect(Collectors.toList());
df.select(JavaConverters.asScalaIteratorConverter(c.iterator()).asScala().toSeq());

相关问题