gpt4 book ai didi

java - 星火Java : How to add an array column in spark Dataframe

转载 作者:行者123 更新时间:2023-12-05 03:43:50 25 4
gpt4 key购买 nike

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

目前,我在 array 函数中使用连续的 lit,但它有一个问题,它不能被参数化,而且作为编码实践看起来最糟糕。我当前的实现如下所示。

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 版本

最佳答案

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

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:

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))
);

关于java - 星火Java : How to add an array column in spark Dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66622169/

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