scala - 生成单行数据框以进行查找
问题描述
这是我之前发布的后续问题。
第1步:
scala> spark.sql("select map('s1', 'p1', 's2', 'p2', 's3', 'p3') as lookup").show()
+--------------------+
| lookup|
+--------------------+
|[s1 -> p1, s2 -> ...|
+--------------------+
第2步:
scala> val df = Seq(("s1", "p1"), ("s2", "p2"), ("s3", "p3")).toDF("s", "p")
df: org.apache.spark.sql.DataFrame = [s: string, p: string]
scala> df.show()
+---+---+
| s| p|
+---+---+
| s1| p1|
| s2| p2|
| s3| p3|
+---+---+
第 3 步:
scala> val df1 = df.selectExpr("map(s,p) lookup")
df1: org.apache.spark.sql.DataFrame = [cc: map<string,string>]
scala> df1.show()
+----------+
| lookup|
+----------+
|[s1 -> p1]|
|[s2 -> p2]|
|[s3 -> p3]|
+----------+
我在步骤 3 中的预期结果是我在步骤 1 中得到的结果。我怎样才能实现它?
解决方案
key 和 value 的两列在合并到map之前应该聚合到数组中。
import org.apache.spark.sql.functions._
df.agg(collect_list("s").as("s"), collect_list("p").as("p"))
.select(map_from_arrays('s,'p).as("lookup"))
.show(false)
输出:
+------------------------------+
|lookup |
+------------------------------+
|[s1 -> p1, s2 -> p2, s3 -> p3]|
+------------------------------+
如果没有collect_list
调用,每一行将单独转换为地图。
推荐阅读
- python - 从(之一)多列的开始自动完成
- c# - xunit - 如何在单元测试中获取 HttpContext.User.Identity
- oracle-apex - 用于根据 oracle Apex 中的其他文本字段向文本字段添加日期的 JavaScript 代码
- reporting-services - 运行报表时尝试允许参数中的多个值全选时发生错误
- flask - jinja2 中的嵌套循环和来自 sqlalchemy 的烧瓶
- django - 如何使用 REST API Django(没有模型)将从 POST 方法保存的数据传递给 GET 方法?
- c++ - 包含 OpenCV 时的 Visual Studio Code“无法打开源文件”错误
- pdf - PDF 版本 1.x 指的是什么?
- vb.net - VB.Net 更改 ListBox 上的高亮颜色
- angular - 如何使用 Keycloack 和 Angular 在同一浏览器中保持会话?