如何根据另一列的值从 Spark DataFrame 中选择特定列?

Posted

技术标签:

【中文标题】如何根据另一列的值从 Spark DataFrame 中选择特定列?【英文标题】:How to select specific columns from Spark DataFrame based on the value of another column? 【发布时间】:2020-04-22 16:40:53 【问题描述】:

考虑一个 DataFrame df 有 4 列 c0c1c2c3 其中 c0c1 是嵌套列(结构类型),另外两个是字符串类型:

root
 |-- c0: struct (nullable = true)
 |    |-- x: string (nullable = true)
 |    |-- y: string (nullable = true)
 |-- c1: struct (nullable = true)
 |    |-- x: string (nullable = true)
 |    |-- y: string (nullable = true)
 |-- c2: string (nullable = true)
 |-- c3: string (nullable = true)

我想根据c3 的值选择c0c1 的所有值。

例子:如果c3的值为“d”,我想选择c0.*否则c1.*

这是我迄今为止尝试过的,但没有运气:

方法:在 select 子句中使用 when 和 else。

.select(
  col("c3"),
  col("c4"),
  when(col("c3") === "d", col("c0.*").otherwise(col("c1.*"))))

这给出了以下异常:

org.apache.spark.sql.AnalysisException: Invalid usage of '*' in expression 'casewhen';

然后我尝试使用df,而不是使用col

.select(
  col("c3"),
  col("c4"),
  when(col("c3") =!= "d", df("c0").otherwise(df("c1"))))

这给出了以下异常:

otherwise() can only be applied on a Column previously generated by when()

对此的任何帮助将不胜感激!

PS:我是 Spark 的初学者 :)

【问题讨论】:

【参考方案1】:

您可以先获取要使用的结构,然后使用* 选择嵌套字段,如下所示:

df.withColumn("c01", when($"c3" === "d", $"c0").otherwise($"c1"))
  .select($"c2", $"c3", $"c01.*")

对于另一个错误:

otherwise() 只能应用于之前由 when() 生成的 Column

您只是在df("c0") 而不是when 列上调用了一个括号。

【讨论】:

以上是关于如何根据另一列的值从 Spark DataFrame 中选择特定列?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用另一列的值从一列创建多列?

根据另一列中的值从一列中减去值(SQL)

如果存在于列表中,则根据另一列的值选择列

Pyspark:如何根据另一列中的匹配值从数组中的第一次出现中选择直到最后的值

如何根据火花DataFrame中另一列的值更改列的值

Pyspark:如何根据另一列的值填充空值