python - 通过将逗号分隔的列的值替换为基于另一个数据框的查找来创建新列

标签 python apache-spark pyspark apache-spark-sql

我有 PySpark 数据框 (source_df),其中有一列的值以逗号分隔。 我正在尝试用基于另一个数据框 (lookup_df) 的查找替换这些值

source_df

A      B      T   ... followed by N unrelated columns...
foo    a,b,c  sam
bar    k,a,c  bob
faz    b,a,f  sam

lookup_df

C D
a h1
b h2
c h3

输出数据框:

A   T     B      new_col     ... followed by N unrelated columns...
foo sam   a,b,c  h1,h2,h3
bar bob   h,a,c  EMPTY,h1,h3
faz sam   b,a,f  h2,h1,EMPTY

A 列是主键并且始终是唯一的。 T 列对于 A 的给定值是唯一的。

最佳答案

您可以拆分和分解列 B 并进行左连接。然后收集D值,用逗号拼接。

import pyspark.sql.functions as F

result = source_df.withColumn(
    'B_split',
    F.explode(F.split('B', ','))
).alias('s').join(
    lookup_df.alias('l'),
    F.expr('s.B_split = l.C'),
    'left'
).drop('C').na.fill(
    'EMPTY', ['D']
).groupBy(
    source_df.columns
).agg(
    F.concat_ws(',', F.collect_list('D')).alias('new_col')
)

result.show()
+---+-----+---+-----------+
|  A|    B|  T|    new_col|
+---+-----+---+-----------+
|foo|a,b,c|sam|   h1,h2,h3|
|faz|b,a,f|sam|h2,h1,EMPTY|
|bar|k,a,c|bob|EMPTY,h1,h3|
+---+-----+---+-----------+

关于python - 通过将逗号分隔的列的值替换为基于另一个数据框的查找来创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66143837/

相关文章:

python - 类型错误 : 'DataFrameWriter' object is not callable

python - Spark 提交到 kubernetes : packages not pulled by executors

python - 元组的 Pandas 数据框?

scala - Spark : scala - how to convert collection from RDD to another RDD

apache-spark - Spark 流式传输错误 : Accumulator must be registered before send to executor

java - NoClassDefFoundError : scala/Product$class

python - PyQt5 : QWebEngineView can't render local html file in Windows 7

python - jupyter 抛出错误 : socket. gaierror: [Errno -2] Name or service not known

python - 如何获取字符串中重复出现的字符的位置?

python - flask_login 有时会混合登录;我以其他人身份登录