我有一个类似于以下的框架:
+-----------+-----------+---------------+------+---------------------+
|best_col |A |B | C |<many more columns> |
+-----------+-----------+---------------+------+---------------------+
| A#B | 14 | 26 | 32 | ... |
| C | 13 | 17 | 96 | ... |
| B#C | 23 | 19 | 42 | ... |
+-----------+-----------+---------------+------+---------------------+
我想以这样的DataFrame结束:
+-----------+-----------+---------------+------+---------------------+----------+
|best_col |A |B | C |<many more columns> | result |
+-----------+-----------+---------------+------+---------------------+----------+
| A#B | 14 | 26 | 32 | ... | 14#26 |
| C | 13 | 17 | 96 | ... | 96 |
| B#C | 23 | 19 | 42 | ... | 19#42 |
+-----------+-----------+---------------+------+---------------------+----------+
本质上,我想添加一个列result
,它将从best_col
列中指定的列中选择值。best_col
仅包含DataFrame中存在的列名。我不想检查像col(best_col) === A
等。我试着做col(col("best_col").toString())
,但这不起作用。有什么简单的方法吗?
5条答案
按热度按时间laximzn51#
你不能完全动态地做到这一点,但你可以简单地使用一个case,当链和列出所有你可以支持的字段(*)时-显然它们必须都具有相同的类型。您的“我不想检查类似”是唯一的方法,AttributeReferences(列名)必须在查询期间固定。
qxgroojn2#
您可以创建一个udf并使用withColumn将整行传递给它。并根据列A的值返回结果。
大概是这样的:
然后使用这个:
xmq68pz93#
下面是一个以编程方式生成适当的when序列的解决方案:
gwbalxhn4#
map< key, value >
,其中key是列名,value是列值。best_col
列使用split
函数拆分其值。transform
高阶函数,遍历每个键,然后从map<string, string>
数据类型中查找并获取值。concat_ws
连接array< value >
下面是示例代码。
或
下面的方法将所有列转换为
map<string, string>
类型。或
使用
udf
t98cgbkg5#
列“best_col”可以拆分,并且对于每个其他列可以添加技术列,如果列在“best_col”中不存在,则为空;以及使用“concat_ws”函数连接的列之后:
结果是: