Spark Scala数据框架:动态转换非空列

dxxyhpgq  于 2023-05-23  发布在  Apache
关注(0)|答案(1)|浏览(187)

我有一个包含N列的 Dataframe ,对于其中的一个子集,我想动态地对该列应用一个非空的函数(或“访问”该列)。对于每一行,该子集中只有一列不为空,但它可以是任何列。这需要独立于列数工作。例如:
具有子集A、B和C的原始 Dataframe :

Id | A    | B    | C     | ...
1  | text | null | null  | ...
2  | null | text | null  | ...
3  | null | null | text  | ...

目标 Dataframe :

Id | A    | B    | C     | ... | Result
1  | text | null | null  | ... | result of f(text)
2  | null | text | null  | ... | result of f(text)
3  | null | null | text  | ... | result of f(text)

先谢谢你了。

relj7zay

relj7zay1#

使用coalesce生成一个列,该列将具有该行的非空值,并对该列应用函数
这将工作:

val cols = df.columns.filterNot(_.startsWith("id")).map(col(_))

df.withColumn("intermediateColumn", coalesce(cols: _*))
.withColumn("Result", YourFunction("intermediateColumn"))

考虑以下输入:

+---+-----+-----+-----+
| id|    A|    B|    C|
+---+-----+-----+-----+
|  1|text1| null| null|
|  1| null|text2| null|
|  1| null| null|text3|
+---+-----+-----+-----+

具有中间列的数据框将是:

+---+-----+-----+-----+------------------+
| id|    A|    B|    C|intermediateColumn|
+---+-----+-----+-----+------------------+
|  1|text1| null| null|             text1|
|  1| null|text2| null|             text2|
|  1| null| null|text3|             text3|
+---+-----+-----+-----+------------------+

应用函数后的输出:
示例函数删除字符串的第一个字母。

+---+-----+-----+-----+------------------+------+
| id|    A|    B|    C|intermediateColumn|Result|
+---+-----+-----+-----+------------------+------+
|  1|text1| null| null|             text1|  ext1|
|  1| null|text2| null|             text2|  ext2|
|  1| null| null|text3|             text3|  ext3|
+---+-----+-----+-----+------------------+------+

相关问题