Spark:使用地图中的键选择

Fra*_*ank 5 apache-spark apache-spark-sql

我需要使用geo.cca mapin a 中的键进行选择DataFrame

 |-- params: map (nullable = true)
 |    |-- key: string
 |    |-- value: string (valueContainsNull = true)
Run Code Online (Sandbox Code Playgroud)

但是键的值,中间有一个点,似乎混淆了 Spark。如果我写:

X.filter(X("params.geo.cc") === "us")
Run Code Online (Sandbox Code Playgroud)

我收到错误:

org.apache.spark.sql.AnalysisException: Can't extract value from params#3[geo];
Run Code Online (Sandbox Code Playgroud)

我能做什么?(不用说,我不控制键,即我不能将该geo.cc字符串更改为例如geo_cc.

hi-*_*zir 6

你应该使用apply

val df = Seq((1L, Map("geo.cc" -> "US"))).toDF("id", "params")

df.select($"params"("geo.cc") === "US").show
// +-----------------------+
// |(params['geo.cc'] = US)|
// +-----------------------+
// |                   true|
// +-----------------------+
Run Code Online (Sandbox Code Playgroud)

或者getItem

df.select($"params".getItem("geo.cc") === "US").show
// +-----------------------+
// |(params['geo.cc'] = US)|
// +-----------------------+
// |                   true|
// +-----------------------+
Run Code Online (Sandbox Code Playgroud)

在特定列上,而不是DataFrame.


M. *_*dru 5

尝试这个 :

X.filter(col("params")("key") === "geo.cc" && col("params")("value") === "us")
Run Code Online (Sandbox Code Playgroud)