java - 用另一个 Spark Java 替换一列值
问题描述
我有一个格式为 df1 的数据框
+------+------+------+
| Col1 | Col2 | Col3 |
+------+------+------+
| A | z | m |
| B | w | n |
| C | x | o |
| A | z | n |
| A | p | o |
+------+------+------+
和另一个格式的数据帧 df2
+------+------+
| Col1 | Col2 |
+------+------+
| 0-A | 0-z |
| 1-B | 3-w |
| 2-C | 1-x |
| | 2-P |
+------+------+-
我正在尝试使用 Spark Java 将 df1 的 Col1 和 Col2 中的值替换为 df2 中的值。
最终数据帧 df3 应该如下所示。
+------+------+------+
| Col1 | Col2 | Col3 |
+------+------+------+
| 0-A | 0-z | m |
| 1-B | 3-w | n |
| 2-C | 1-x | o |
| 0-A | 0-z | n |
| 0-A | 2-p | o |
+------+------+------+
我正在尝试将 df1 的 column1 和 column2 中的所有值替换为 df2 的 col1 和 col2 中的值。无论如何,我可以在 Spark Java 数据帧语法中实现这一点。?
我最初的想法是做以下事情。
String pattern1="\\p{L}+(?: \\p{L}+)*$";
df1=df1.join(df2, df1.col("col1").equalTo(regexp_extract(df2.col("col1"),pattern1,1)),"left-semi");
解决方案
join
用下面的连接替换你的最后一个操作。
df1.alias("x").join(df2.alias("y").select(col("y.Col1").alias("newCol1")), col("x.Col1") === regexp_extract(col("newCol1"),"\\p{L}+(?: \\p{L}+)*$",0), "left")
.withColumn("Col1", col("newCol1"))
.join(df2.alias("z").select(col("z.Col2").alias("newCol2")), col("x.Col2") === regexp_extract(col("newCol2"),"\\p{L}+(?: \\p{L}+)*$",0), "left")
.withColumn("Col2", col("newCol2"))
.drop("newCol1", "newCol2")
.show(false)
+----+----+----+
|Col1|Col2|Col3|
+----+----+----+
|2-C |1-x |o |
|0-A |0-z |m |
|0-A |0-z |n |
|0-A |2-p |o |
|1-B |3-w |n |
+----+----+----+
推荐阅读
- reactjs - 在 url 更改时重新渲染组件的问题
- react-native - React Native:警告:列表中的每个孩子都应该有一个唯一的“关键”道具
- flutter - 等待网络图像和 CircularProgressIndicator
- python - 将参数传递给本地存储的 bash 脚本,需要使用 Python Paramiko 在远程机器上执行
- jinja2 - 将字符串附加到数组并重新加入字符串
- visual-studio-code - 如何在 VScode 中激活智能感知?(C#)
- postgresql - 如何使用 postgres 计算客户重新预订率
- sql - 带有行号的 Oracle Sql Delete 引发错误 ORA-00904:“RN”:标识符无效
- javascript - 将 12 件套产品添加到购物车
- java - 测试一个集合是否只有一个元素与谓词匹配