首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spark-Java :如何在spark Dataframe中添加数组列

Spark-Java :如何在spark Dataframe中添加数组列
EN

Stack Overflow用户
提问于 2021-03-14 15:42:30
回答 1查看 436关注 0票数 1

我正在尝试向我的Spark Dataframe添加一个新列。添加的新列的大小将基于变量(例如salt) post,我将使用该列分解数据集以用于盐连接。

目前,我在array函数中使用连续的lit,但这有一个问题,它不能被参数化,而且作为一种编码实践看起来很糟糕。我目前的实现看起来像下面这样。

代码语言:javascript
复制
int salt =3;

Dataset<Row> Reference_with_Salt_Col = Reference.withColumn("salt_array", array(lit(0), lit(1), lit(2)));

我参考和研究了各种方法,但似乎都不能解决Java中的问题。虽然functions.typedlit方法适用于Python/Scala语言,但似乎不适用于Java。进一步传递数组或列表也不会帮助spark在相同的数组或列表上给出错误。

我使用的是Spark 2.2.0和Java 1.8版本

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-14 20:59:29

您可以使用array函数,但首先将列表中的每个元素转换为lit。在流上使用map函数的示例:

代码语言:javascript
复制
import org.apache.spark.sql.*;

import java.util.Arrays;
import java.util.List;

// example of input dataframe
Reference.show();

//+-----+
//|label|
//+-----+
//|    a|
//|    b|
//|    c|
//+-----+

List<Integer> salt_array = Arrays.asList(0, 1, 2);

Reference.withColumn(
        "salt_array",
        functions.array(salt_array.stream().map(functions::lit).toArray(Column[]::new))
).show();

//+-----+----------+
//|label|salt_array|
//+-----+----------+
//|    a| [0, 1, 2]|
//|    b| [0, 1, 2]|
//|    c| [0, 1, 2]|
//+-----+----------+

要生成一个包含从0到salt - 1的范围的数组,可以像这样使用IntStream.rangeClosed

代码语言:javascript
复制
import java.util.stream.IntStream;

int salt = 3;

Dataset<Row> Reference_with_Salt_Col = Reference.withColumn(
        "salt_array",
        functions.array(IntStream.rangeClosed(0, salt - 1).mapToObj(functions::lit).toArray(Column[]::new))
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66622169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档