如何显示带有数据框别名的Pyspark加入DataFrame的列名称?

问题描述 投票:0回答:2

假设我们在 pyspark 中加入 2 个数据帧,每个数据帧都有其别名,并且它们具有相同的列:

   joined_df = source_df.alias("source").join(target_df.alias("target"), \ 
               (col("source.A_column") == col("target.A_column")), 'outer')

如何获取 joined_df 数据帧的列名称列表以及数据帧中的别名,例如:

[源.A_列,目标.A_列,源.B_列,目标.B_列,源.C_列,目标.C_列]

它会在分析异常的情况下显示,所以显然信息存储在某处,但我没有找到方法,如何以某种方式显示它而不出现异常......

我尝试过的:

  1. 使用一些直接方法或属性获取如上所述的名称,但没有像 df.columns_with_alias 属性
  2. 这样的东西
  3. 从 Dataframe 中获取列列表作为 Column 类的实例(因为该类保存别名信息),但 df.columns 只是给你字符串......而且我没有找到其他方法。

有什么办法,如何显示这个列名吗?

python dataframe pyspark
2个回答
0
投票

使用函数生成新的列名

def add_alias(columns, alias):
    return [f"{alias}_{column}" for column in columns]

案例1:如果您有权访问源和目标DataFrame

  1. 使用
    toDF()
    函数更改整个列名称
source_df = source_df.toDF(*add_alias(source_df.columns, "source"))
target_df = target_df.toDF(*add_alias(target_df.columns, "target"))
  1. 使用这个新的列名称加入
source_df.join(target_df, col("source_id") == col("target_id"), "outer").show()

输出:

+---------+-------------+---------+-------------+
|source_id|source_result|target_id|target_result|
+---------+-------------+---------+-------------+
|        a|           35|        a|           35|
|        b|           20|        b|           20|
+---------+-------------+---------+-------------+

案例2:如果您无权访问源和目标DataFrame

  1. 使用
    source
    target
    DataFrame
  2. 添加别名
joined_df = source_df.alias("src").join(
            target_df.alias("tgt"), source_df.id == target_df.id, "outer")

注意:在这种情况下,所有源和目标 DataFrame 将分别位于左侧和右侧。

  1. 使用DataFrame的别名来提取列名
joined_source_columns = joined_df.select("src.*").columns
joined_target_columns = joined_df.select("tgt.*").columns
  1. 将此数据与
    add_alias()
    函数一起使用来获取修改后的列名称
joined_df_columns = add_alias(joined_source_columns, "source") + add_alias(joined_target_columns, "target")

joined_df.toDF(*joined_df_columns).show()

输出:

+---------+-------------+---------+-------------+
|source_id|source_result|target_id|target_result|
+---------+-------------+---------+-------------+
|        a|           35|        a|           35|
|        b|           20|        b|           20|
+---------+-------------+---------+-------------+

0
投票

我发现了一种非常丑陋的方法,它只能用于调试目的,绝对不适用于生产代码:

 def show_column_names_with_alias(self, df: DataFrame):    
     try:        
         df.select("this_column_name_is_not_in_the_dataframe")    
    except Exception as e:        
        import re
        # version for 9.1
        # print(re.search("\[(.*)\]", e.desc).group(1))

        # version for 13.3.
        print(re.findall("\[(.*?)\]", e.desc)[1])

这应该引发异常,其中异常消息中存在带有别名信息的列。我解析打印的消息,就是这样......它有效,但必须有更好的方法。 输出是:

source.A_column, target.A_column, source.B_column, target.B_column, source.C_column, target.C_column
© www.soinside.com 2019 - 2024. All rights reserved.