python - 合并具有不同列的两个 spark 数据框以获取所有列
问题描述
假设我有 2 个 spark 数据框:
Location Date Date_part Sector units
USA 7/1/2021 7/1/2021 Cars 200
IND 7/1/2021 7/1/2021 Scooters 180
COL 7/1/2021 7/1/2021 Trucks 100
Location Date Brands units values
UK null brand1 400 120
AUS null brand2 450 230
CAN null brand3 150 34
我需要我的结果数据框
Location Date Date_part Sector Brands units values
USA 7/1/2021 7/1/2021 Cars 200
IND 7/1/2021 7/1/2021 Scooters 180
COL 7/1/2021 7/1/2021 Trucks 100
UK null 7/1/2021 brand1 400 120
AUS null 7/1/2021 brand2 450 230
CAN null 7/1/2021 brand3 150 34
所以我想要的 df 应该包含来自两个数据框的所有列,我还需要所有行中的 Date_part 这是我尝试过的:
df_result= df1.union(df_2)
但我得到了这个作为我的结果。正在交换值,并且缺少第二个数据框中的一列。
Location Date Date_part Sector Brands units
USA 7/1/2021 7/1/2021 Cars 200
IND 7/1/2021 7/1/2021 Scooters 180
COL 7/1/2021 7/1/2021 Trucks 100
UK null brand1 400 120
AUS null brand2 450 230
CAN null brand3 150 34
任何建议请
解决方案
union
:此函数按位置(不是按名称)解析列
这就是您认为“正在交换值并且第二个数据帧中的一列丢失”的原因。
您应该使用unionByName
,但此功能要求两个数据框具有相同的结构。
我为您提供了这个简单的代码来协调数据框的结构,然后执行 union(ByName)。
from pyspark.sql import DataFrame
from pyspark.sql import functions as F
def add_missing_columns(df: DataFrame, ref_df: DataFrame) -> DataFrame:
"""Add missing columns from ref_df to df
Args:
df (DataFrame): dataframe with missing columns
ref_df (DataFrame): referential dataframe
Returns:
DataFrame: df with additionnal columns from ref_df
"""
for col in ref_df.schema:
if col.name not in df.columns:
df = df.withColumn(col.name, F.lit(None).cast(col.dataType))
return df
df1 = add_missing_columns(df1, df2)
df2 = add_missing_columns(df2, df1)
df_result = df1.unionByName(df2)
推荐阅读
- python - 从值之间而不是在用户列表中的 sql 表中选择元素
- facebook - 如何从网站向特定的 Facebook 用户发送消息?
- json - axios请求从Vue中的嵌套数组中获取值
- c++ - c++ libcurl使用github库发送smtp邮件失败
- java - 在 WAS 9 上使用 Apache HttpClient 和 IBM Jsse2 的 SSLHandshakeException
- python - 使用 elementtree 对嵌套元素进行排序
- java - 为什么这被认为是不安全的?
- excel - 应用程序.双击
- cmake - 为 CMake 项目添加包含路径到 qt-creator
- django - Django rest api - 使用搜索过滤器搜索方法字段