映射 dict(来自 rdd)以递归方式更改 Python/PySpark 中的列名

Posted

技术标签:

【中文标题】映射 dict(来自 rdd)以递归方式更改 Python/PySpark 中的列名【英文标题】:Mapping dict (from rdd) to recursively change column names in Python/PySpark 【发布时间】:2021-06-21 05:29:47 【问题描述】:

我有一个带有新变量名(col2)和旧变量名(col1)的数据框。

我有另一个带有列的数据框 (tf)(在 col1 中命名)

期望的结果(tf_new)是将列名转换为col2中的名称(abs->fc_abc)

我现在尝试通过执行以下操作来避免 udf uptil:

#converting df into rdd
newrdd = df.rdd
#generating a map
keypair_rdd = newrdd.map(lambda x : (x[1],x[0]))
#creating key value pair
dict = keypair_rdd.collectAsMap()

在使用 dict 将 tf 转换为 tf_new 方面需要帮助。

Python 中的类似解决方案也会有很大帮助。

【问题讨论】:

【参考方案1】:
    将第一个数据帧收集到 Python 字典中
dict = df.agg(F.map_from_arrays(F.collect_list("col1"), 
  F.collect_list("col2"))).first()[0]
    创建tf 的所有列的列表并重命名dict 中包含的那些列
renamed_cols = [F.col(c).alias(dict[c]) if c in dict 
  else F.col(c) for c in tf.columns]
    使用重命名的列来选择数据
tf.select(renamed_cols).show()

【讨论】:

以上是关于映射 dict(来自 rdd)以递归方式更改 Python/PySpark 中的列名的主要内容,如果未能解决你的问题,请参考以下文章

Scala RDD 映射

以递归方式展平包含未知级别的嵌套数组和映射的嵌套映射

python dict clear只能删除一层,不能够递归删除。

Python标准库:内置函数dict(mapping, **kwarg)

有没有办法以递归方式列出所有使用更改方法的类?

在 Spark Streaming 中刷新 RDD