scala - 如何根据另一个数据框中的数据填充数据框值
问题描述
查找 DF:
+--------------------+------------------+
| seller_name| codes|
+--------------------+------------------+
| BlueR |[5944, 5813, 5812]|
| jack |[4814, 5734, 5968]|
| Cwireless |[7349, 7399, 5999]|
| Tea |[4899, 5813, 8398]|
基础DF:
seller_name | raw_code
BlueR | 5813
jack | 5968
Cwireless | 7865
Tea | 5999
Tea | 5813
blueR | 5678
jack | 9999
Tea | null
如果seller_name
BaseDF中LookUp data frame
的_ _ _比该值应替换为该卖方元组中的第一个元素。raw_code
seller_name
codes
LookUp
raw_code
edit:
如果df中不存在seller_name
of ,则应按原样保留该值。base_df
lookup
raw_code
预期输出 DF:
seller_name | revised_code
blueR | 5813
jack | 5968
Cwireless | 7349
Tea | 4899
Tea | 5813
blueR | 5678
jack | 4814
Tea | 4899
我该如何实现这个功能?
解决方案
广播小的lookUpDf并与baseDf左连接,然后使用udf
函数检查是否raw_code
包含在中codes
,如果确实返回数组的raw_code
else第一个值。codes
import org.apache.spark.sql.functions._
def retainUdf = udf((rawCode: Int, codes:Seq[Int]) => if(codes == null || codes.isEmpty) rawCode else if(codes.contains(rawCode)) rawCode else codes.head)
baseDf.join(broadcast(lookUpDf), Seq("seller_name"), "left")
.select(col("seller_name"), retainUdf(col("raw_code"), col("codes")).as("raw_code"))
这应该给你
+-----------+--------+
|seller_name|raw_code|
+-----------+--------+
|BlueR |5813 |
|jack |5968 |
|Cwireless |7349 |
|Tea |4899 |
|Tea |5813 |
|blueR |5678 |
|jack |4814 |
+-----------+--------+
我希望答案有帮助
推荐阅读
- php - 如何防止在 Wordpress 上发布重复评论?
- quickbooks - Quickbooks:无需人工交互的身份验证和授权
- firebase - 什么样的值传递给 firebase 中的 isSignInWithEmailLink(String value)
- python - 我正在尝试制作 discord.py on_member_join 但它不会触发
- javascript - 返回未定义的随机对象数组
- python - Python & OpenCV:如何在无网格表中添加线条
- javascript - 科尔多瓦插件没有被转译
- flutter - Flutter 中的数据类型
- python - python - 如何使用Python列出JSON非列表项以及带有pandas.json_normalize的列表项?
- javascript - 将 iframe 的文档附加到父级