python - 加入两个数据帧后的 Pyspark 重复
问题描述
我有两个 Pyspark df
df1
TransID Date custusername
1 11/01 1A
2 11/01 1A
3 11/02 1A
4 11/02 1A
5 11/03 1A
df2
custusername Date CustID
1A 11/01 xx1
1A 11/02 xx1
1A 11/03 xx2
加入两个数据帧并计数后的所需输出
Date CustID Count
11/01 xx1 2
11/02 xx1 2
11/03 xx2 1
我得到的实际输出是
11/01 xx1 2
11/01 xx2 2
11/02 xx1 2
11/02 xx2 2
11/03 xx1 1
11/03 xx2 1
因为 CustID 在 11/03 更新,所以我的计数重复了。
我的代码
join = [df1.custusername == df2.custusername]
joined = df1.join(df2, join, "inner")
解决方案
有两个数据框:
df1 = spark.createDataFrame([
(1, "11/01", "1A"),
(2, "11/01", "1A"),
(3, "11/02", "1A"),
(4, "11/02", "1A"),
(5, "11/03", "1A"),
], schema=['TransId', 'Date', 'custusername'])
df1.show()
+-------+-----+------------+
|TransId| Date|custusername|
+-------+-----+------------+
| 1|11/01| 1A|
| 2|11/01| 1A|
| 3|11/02| 1A|
| 4|11/02| 1A|
| 5|11/03| 1A|
+-------+-----+------------+
df2 = spark.createDataFrame([
("1A", "11/01", "xx1"),
("1A", "11/02", "xx1"),
("1A", "11/03", "xx2"),
], schema=['custusername', 'Date', 'CustId'])
df2.show()
+------------+-----+------+
|custusername| Date|CustId|
+------------+-----+------+
| 1A|11/01| xx1|
| 1A|11/02| xx1|
| 1A|11/03| xx2|
+------------+-----+------+
我将按 和 对第一个 DataFrame 进行Date
分组custusername
。
df1_group = df1.groupBy('Date', 'custusername').count()
df1_group.show()
+-----+------------+-----+
| Date|custusername|count|
+-----+------------+-----+
|11/01| 1A| 2|
|11/03| 1A| 1|
|11/02| 1A| 2|
+-----+------------+-----+
然后只需加入df2
df = df1_group.join(df2, on=['custusername', 'Date'], how='left')
df.show()
+------------+-----+-----+------+
|custusername| Date|count|CustId|
+------------+-----+-----+------+
| 1A|11/01| 2| xx1|
| 1A|11/03| 1| xx2|
| 1A|11/02| 2| xx1|
+------------+-----+-----+------+
推荐阅读
- c++ - 错误:从 'std::__1::__wrap_iter 没有可行的转换
'到'int' - c - 数组中的二分查找
- javascript - NodeJS API 获取每个类别的 Items 数组
- c - 从文件指示的文件中读取
- flutter - 颤动 - 如何使用 Chewie 控制器恢复播放先前持续时间的视频?
- scala - Scala Map调用多个函数
- python-3.x - 在Python中发出http请求时如何在代理密码字符串中转义@字符
- python - Python动态属性文件
- javascript - 如何在玩笑中强制函数的返回值?
- python - 我的 selenium webdrivers 将打开几秒钟,然后 chrome.exe 意外退出