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

Spark dataframe将行中特定列的值替换为Null

裴俊雅
2023-03-14

我在尝试用空值替换Spark数据帧特定列的值时遇到了一个问题。我有一个超过50列的数据框架,其中两列是关键列。我想用相同的模式创建一个新的数据框,新的数据框应该具有来自键列的值,而非键列中的值应该为null。我尝试了以下方法,但遇到了问题:

//old_df is the existing Dataframe 
val key_cols = List("id", "key_number")
val non_key_cols = old_df.columns.toList.filterNot(key_cols.contains(_))

val key_col_df = old_df.select(key_cols.head, key_cols.tail:_*)
val non_key_cols_df = old_df.select(non_key_cols.head, non_key_cols.tail:_*)
val list_cols = List.fill(non_key_cols_df.columns.size)("NULL")
val rdd_list_cols = spark.sparkContext.parallelize(Seq(list_cols)).map(l => Row(l:_*))
val list_df = spark.createDataFrame(rdd_list_cols, non_key_cols_df.schema)

val new_df = key_col_df.crossJoin(list_df)

当我在old_df中只有字符串类型列时,这种方法很好。但是我有一些双类型和int类型的列,这是抛出错误的,因为rdd是一个空字符串列表。

为了避免这种情况,我尝试将list_df作为空数据帧,将模式作为non_key_cols_df,但CrossJoin的结果是一个空数据帧,我相信这是因为一个数据帧是空的。

我的要求是将非键列作为一个具有空值的单行数据帧,以便我可以与键列df进行交叉连接,并形成所需的新df。

此外,任何其他更简单的方法将数据帧的所有列(关键列除外)更新为空将解决我的问题。提前谢谢

共有2个答案

酆晔
2023-03-14

Shaido答案有一个小缺点——列类型会丢失。可以用模式使用来修复,如下所示:

val nonKeyCols = df.schema.fields.filterNot(f => keyCols.contains(f.name))
val df2 = nonKeyCols.foldLeft(df)((df, c) => df.withColumn(c.name, lit(null).cast(c.dataType)))
邵兴怀
2023-03-14

CrossJoin是一个昂贵的操作,因此您希望尽可能避免它。一个更简单的解决方案是遍历所有非键列并使用light(null)插入null。使用fold↓可以按如下方式完成:

val keyCols = List("id", "key_number")
val nonKeyCols = df.columns.filterNot(keyCols.contains(_))

val df2 = nonKeyCols.foldLeft(df)((df, c) => df.withColumn(c, lit(null)))

输入示例:

+---+----------+---+----+
| id|key_number|  c|   d|
+---+----------+---+----+
|  1|         2|  3| 4.0|
|  5|         6|  7| 8.0|
|  9|        10| 11|12.0|
+---+----------+---+----+

将给予:

+---+----------+----+----+
| id|key_number|   c|   d|
+---+----------+----+----+
|  1|         2|null|null|
|  5|         6|null|null|
|  9|        10|null|null|
+---+----------+----+----+
 类似资料:
  • 我想用相邻列中的值替换一列中的空值,例如,如果我 我希望它是: 尝试过 但没有工作,它说值应该是浮点数、int、长、字符串或判决 有什么想法吗?

  • 我试图替换或更新dataframe中的某些特定列值,因为我们知道dataframe是不可变的,我试图转换到新的dataframe而不是更新或替换。 错误:重载方法值数组 非常感谢您的帮助!!

  • 我在Python中使用这个熊猫数据帧。 我需要用Farheit列中的值替换列中的所有NaN。 这就是我需要的: 如果进行布尔选择,一次只能选择其中一列。问题是,如果我尝试加入他们,我无法在保持正确顺序的同时做到这一点。 我如何才能只找到带有s的行,并用列的同一行中的值替换它们?

  • 用其他dataframe的列值替换dataframe的一列中的nan值时出现问题。下面是一个测试示例: 我想用其他dataframe中的特定值替换列名中的Nan值(如果其中有一些Nan值,则不是其他列),例如此dataframe中的Name2值: 我想得到的是: 这是此示例的测试代码: 然后我尝试了这三种方法,但都不起作用——我的数据帧始终保持Nan值。 你能告诉我哪里出错了吗?

  • 我正在从文本文件中读取预订系统的座位数据,并将其写入ArrayList中。一个行将被放入一个可变的fileline中。文件行是从每个“,”中拆分出来的,并放入名为Components的数组中。然后将组件放入对象中。 txt文件示例 然后进入一个if语句,检查座位是否合适,如果合适,我想将false更改为true,并将乘客名添加为null,但只在合适的座位上。我想知道是否有任何方法可以覆盖文本文件中

  • 在MongoDB中,我有一个电影集合,其中有一组语言,例如