当前位置: 首页 > 知识库问答 >
问题:

在Spark 3.1.1 java中添加新列作为数组

柳修为
2023-03-14

我想在现有数据集中添加一个新列作为数组。这是我现有的数据集。

+----------------------+-------------------+
|col 1                 |col2               |
+----------------------+-------------------+
|val1                  |a                  |
|val2                  |b                  |
|val3                  |c                  |
--------------------------------------------

我有这个静态数据

public static final String Dates = "2021-07-06,2021-07-07,2021-07-08";
+----------------------+-------------------+----------------------------------------+
|col 1                 |col2               | col3                                   |
+----------------------+-------------------+-----------------------------------------
|val1                  |a                  | [2021-07-06, 2021-07-07, 2021-07-08]   |
|val2                  |b                  | [2021-07-06, 2021-07-07, 2021-07-08]   |
|val3                  |c                  | [2021-07-06, 2021-07-07, 2021-07-08]   |
-------------------------------------------------------------------------------------
Column[] new_data =
            Arrays.asList(Dates.split(",")).stream().map(functions::lit).toArray(Column[]::new);
data.withColumn("col3",array(new_data));
data
.withColumn("col3",lit(dates)) # add your string 
.withColumn("col3",split(col("col3"),",")) # Split your string 

现在我得到了想要的结果。之后,我应用explode(),它会将col3值分配到每一行。

.withColumn("col3",explode("col3"))

我就像这样

+----------------------+-------------------+----------------------------------------+
|col 1                 |col2               | col3                                   |
+----------------------+-------------------+-----------------------------------------
|val1                  |a                  | 2021-07-06                             |
|val2                  |b                  | 2021-07-06                             |
|val3                  |c                  | 2021-07-06                             |
|val1                  |a                  | 2021-07-07                             |
|val2                  |b                  | 2021-07-07                             |
|val3                  |c                  | 2021-07-07                             |
|val2                  |b                  | 2021-07-08                             |
|val3                  |c                  | 2021-07-08                             |
-------------------------------------------------------------------------------------

从这个结果数据集中,我基于col3&col1创建了新列col4(如果col3日期大于特定日期&col1值大于某个值,则col4值为true,否则为false)。

data.withColumn("col4",when("col3".gt(Passing_one_date).and("col1".gt(lit(123))),lit(true))).otherwise(lit(false)));
+----------------------+-------------------+----------------------------------------+----------------
|col 1                 |col2               | col3                                   | Col4           |
+----------------------+-------------------+----------------------------------------------------------
|val1                  |a                  | 2021-07-06                             | true           |
|val2                  |b                  | 2021-07-06                             | false          |
|val3                  |c                  | 2021-07-06                             | true           |
|val1                  |a                  | 2021-07-07                             | true           |
|val2                  |b                  | 2021-07-07                             | false          |
|val3                  |c                  | 2021-07-07                             | true           |
|val1                  |a                  | 2021-07-08                             | true           |
|val2                  |b                  | 2021-07-08                             | false          |
|val3                  |c                  | 2021-07-08                             | true           |
------------------------------------------------------------------------------------------------------
data.filter("col4"); -> Selecting true values only

+----------------------+-------------------+----------------------------------------+----------------
|col 1                 |col2               | col3                                   | Col4           |
+----------------------+-------------------+----------------------------------------------------------
|val1                  |a                  | 2021-07-06                             | true           |       
|val3                  |c                  | 2021-07-06                             | true           |
|val1                  |a                  | 2021-07-07                             | true           |
|val3                  |c                  | 2021-07-07                             | true           |
|val1                  |a                  | 2021-07-08                             | true           |
|val3                  |c                  | 2021-07-08                             | true           |
------------------------------------------------------------------------------------------------------

共有1个答案

姬向明
2023-03-14
data
.withColumn("col3",lit(dates)) // add your string 
.withColumn("col3",split(col("col3"),",")) // Split your string 

回答第二部分:

data.drop("col3").distinct() 
 类似资料:
  • 我用的是PySpark,我有一个Spark数据框架,里面有一堆数字列。我想添加一列,它是所有其他列的总和。 假设我的数据帧具有列“a”、“b”和“c”。我知道我能做到: 问题是,我不想单独键入每列并添加它们,尤其是如果我有很多列。我希望能够自动执行此操作,或者通过指定要添加的列名列表来执行此操作。有其他方法吗?

  • 我有一个如下的数据帧: 我想将其转换为如下内容: B中重复的值是列名称,其值在C列中。我希望它们是数据帧的列 事实上,数据集是通过展平一棵树创建的,其中有更多的列,每个列都是一个内部节点。第一列是根,C是叶 以下是我的一些尝试: 然而,它不起作用。

  • 问题内容: 我正在使用PySpark,并且有一个带有一堆数字列的Spark数据框。我想添加一列,它是所有其他列的总和。 假设我的数据框具有列“ a”,“ b”和“ c”。我知道我可以这样做: 问题是我不想单独键入每列并添加它们,尤其是当我有很多列时。我希望能够自动执行此操作,或者希望通过指定要添加的列名列表来执行此操作。还有另一种方法吗? 问题答案: 这并不明显。我看不到spark Datafra

  • 问题内容: TL; DR:如何在ModelForm中为ForeignKey添加“添加新”按钮? 长版:我在项目中使用Django 1.7。我的models.py中有这两个模型 [省略了一些其他不相关的字段] 我正在使用ModelForm用新命令填充数据库,如下所示: Django在为客户字段添加下拉菜单方面做得很好,并在其中添加了来自客户的条目。不过,我想拥有一个“添加新客户”链接/按钮/以便在添

  • 问题内容: 我有一个形状为(X,Y)的Pandas数据框对象,如下所示: 还有一个形状为(X,Z)的numpy稀疏矩阵(CSC),看起来像这样 如何将矩阵中的内容添加到新命名列中的数据框中,以使数据框最终像这样: 请注意,数据框现在具有形状(X,Y + 1),并且矩阵中的行是数据框中的元素。 问题答案: import numpy as np import pandas as pd import s

  • 我有一个Spark DataFrame,我正在尝试基于以前的列创建一个新列,但对我来说,困难的是我已经按行计算了列的值。例如: 列1 |列2 |列3 1 | 2 | 3 4|5|0 3 | 1 | 1 因此,我想要一个新列,每行具有表达式 max(col1, col2, col3)的列名。所以,所需的输出: Col1 |Col2 |Col3 |Col4 1|2|3|'col3' 4|5|0|'co