apache-spark - Spark数据框左连接应在右侧添加默认行而不是null的连接
问题描述
我试图将 Pyspark 中的两个数据框留在一个公共列上。如果公共列的值不存在于右侧数据框中,则插入空值。我希望它与正确数据框中的默认行连接,而不是空值。有可能实现这一目标吗?
df1 = df1.join(df2, [df1.id == df2.channel_id], "left")
df1.select('channel_id', 'channel_name').show()
我的代码为不匹配的行打印 null、null。相反,我希望它与 id = 0 的行匹配,这是默认值。
解决方案
- 这可能是实现您想要的一种方式。
(1) 首先让我们创建 2 个示例 DataFrame,并将left
它们连接起来得到df_join
.
df1 = spark.createDataFrame([(1,'a'), (2,'b'),(3, 'f'),(4,'c'),(5, 'd')], ['id', 'name1'])
df2 = spark.createDataFrame([(1,'aaa'), (2,'bb'),(7, 'ff'),(4,'cc'),(8,'mm'), (10,'kk')], ['channel_id', 'channel_name'])
df1.show()
df2.show()
df_join = df1.join(df2, [df1.id == df2.channel_id], "left")
df_join.orderBy('id').show()
DataFrames 如下所示。您可以看到id
3 和 5 的行不存在于 中df2
,因此它们在 columns:channel_id
和channel_name
are中的对应值null
。我们想用 行中的相应值填充它们id==1
。
------ df1 ------
+---+-----+
| id|name1|
+---+-----+
| 1| a|
| 2| b|
| 3| f|
| 4| c|
| 5| d|
+---+-----+
------ df2 ------
+----------+------------+
|channel_id|channel_name|
+----------+------------+
| 1| aaa|
| 2| bb|
| 7| ff|
| 4| cc|
| 8| mm|
| 10| kk|
+----------+------------+
------ df_join ------
+---+-----+----------+------------+
| id|name1|channel_id|channel_name|
+---+-----+----------+------------+
| 1| a| 1| aaa|
| 2| b| 2| bb|
| 3| f| null| null|
| 4| c| 4| cc|
| 5| d| null| null|
+---+-----+----------+------------+
(2) 接下来,选择你想要依赖的默认行,这里我只是使用了带有id==1
.
default_row = df_join.where(df_join['id']==1).select('channel_id', 'channel_name').take(1)[0].asDict()
print('----- default_row: {} ------'.format(default_row))
输出显示我们将使用的默认值:
----- default_row: {'channel_id': 1, 'channel_name': 'aaa'} ------
(3) 现在我们可以fillna
在每一列上使用填充所有 Null
for k, v in default_row.items():
df_join = df_join.fillna(v, subset=k)
df_join.orderBy('id').show()
最终的 DataFrame 如下所示。空值已成功填充。
+---+-----+----------+------------+
| id|name1|channel_id|channel_name|
+---+-----+----------+------------+
| 1| a| 1| aaa|
| 2| b| 2| bb|
| 3| f| 1| aaa|
| 4| c| 4| cc|
| 5| d| 1| aaa|
+---+-----+----------+------------+
推荐阅读
- scala - 处理将数据帧保存到 Hbase-spark scala 的代码时出错
- python - 在 requests.post 之后返回请求上下文
- apache-camel - 骆驼豆生命周期策略?
- java - 具有 MayToMany 关系的 Spring Data JPA 规范
- office-js - 在 Word 客户端而不是文档中存储值
- ios - 函数不会运行所有行
- javascript - 如何设置 ember-simple-google-maps 环境变量?
- powershell - 如何在编码部署到 EC2 实例后自动启动(或创建和启动)Windows 服务
- c# - 遍历 IEnumerable 并按日期和时间跨度差异分组
- laravel - Laravel 嵌套数组验证消息