如何根据另一列的值从 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 列 c0
、c1
、c2
和 c3
其中 c0
和 c1
是嵌套列(结构类型),另外两个是字符串类型:
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
的值选择c0
或c1
的所有值。
例子:如果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 中选择特定列?的主要内容,如果未能解决你的问题,请参考以下文章