我正在尝试向我的Spark Dataframe添加一个新列。添加的新列的大小将基于变量(例如salt) post,我将使用该列分解数据集以用于盐连接。
目前,我在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版本
发布于 2021-03-14 20:59:29
您可以使用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))
);https://stackoverflow.com/questions/66622169
复制相似问题