假设我们在 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_列]
它会在分析异常的情况下显示,所以显然信息存储在某处,但我没有找到方法,如何以某种方式显示它而不出现异常......
我尝试过的:
有什么办法,如何显示这个列名吗?
使用函数生成新的列名
def add_alias(columns, alias):
return [f"{alias}_{column}" for column in columns]
案例1:如果您有权访问源和目标DataFrame
toDF()
函数更改整个列名称source_df = source_df.toDF(*add_alias(source_df.columns, "source"))
target_df = target_df.toDF(*add_alias(target_df.columns, "target"))
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
source
和 target
DataFramejoined_df = source_df.alias("src").join(
target_df.alias("tgt"), source_df.id == target_df.id, "outer")
注意:在这种情况下,所有源和目标 DataFrame 将分别位于左侧和右侧。
joined_source_columns = joined_df.select("src.*").columns
joined_target_columns = joined_df.select("tgt.*").columns
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|
+---------+-------------+---------+-------------+
我发现了一种非常丑陋的方法,它只能用于调试目的,绝对不适用于生产代码:
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