簡體   English   中英

生成單行數據框進行查找

[英]Generate a single row dataframe for lookup

這是我之前發布的后續問題

第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]|
+----------+

我在 step3 中的預期結果是我在 step1 中得到的結果。 我怎樣才能實現它?

鍵和值的兩列應在將它們合並到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調用,每一行都將單獨轉換為一個映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM