如何检查 Pyspark Map 中是否存在键或值
How to check whether key or value exist in Pyspark Map
我在 spark DF 中有一个 Map 列,我想在特定键上过滤此列(即,如果 map 中的键与所需值匹配,则保留该行)。
例如,我的架构定义为:
df_schema = StructType(
[StructField('id', StringType()),
StructField('rank', MapType(StringType(), IntegerType()))]
)
我的示例数据是:
{ "id": "0981850006", "rank": {"a": 1} }
有什么方法可以在不使用 explode() 的情况下过滤 "a" 在 "rank" 中的行上的 df 吗?
是否有比我定义的更好的给定 json 模式表示?
使用 rank.key
访问密钥将意味着 rank
是 StructType()
。尽管 explode 可能是最好的解决方案,但让我们构建一个 UDF 来评估 k 是否是 rank
.
的键
首先让我们创建我们的数据框:
from pyspark.sql.types import *
df_schema = StructType(
[StructField('id', StringType()),
StructField('rank', MapType(StringType(), IntegerType()))]
)
df = spark.createDataFrame([
["0981850006", {"a": 1}],
["0981850006", {"b": 2, "c": 3}],
], df_schema)
现在我们的 UDF:
def isKey(k,d):
return k in d.keys()
isKey_udf = lambda k: psf.udf(lambda d: isKey(k,d), BooleanType())
给出:
df.withColumn(
"is_key",
isKey_udf('a')(df.rank)
)
+----------+-------------------+------+
| id| rank|is_key|
+----------+-------------------+------+
|0981850006| Map(a -> 1)| true|
|0981850006|Map(b -> 2, c -> 3)| false|
+----------+-------------------+------+
我在 spark DF 中有一个 Map 列,我想在特定键上过滤此列(即,如果 map 中的键与所需值匹配,则保留该行)。
例如,我的架构定义为:
df_schema = StructType(
[StructField('id', StringType()),
StructField('rank', MapType(StringType(), IntegerType()))]
)
我的示例数据是:
{ "id": "0981850006", "rank": {"a": 1} }
有什么方法可以在不使用 explode() 的情况下过滤 "a" 在 "rank" 中的行上的 df 吗?
是否有比我定义的更好的给定 json 模式表示?
使用 rank.key
访问密钥将意味着 rank
是 StructType()
。尽管 explode 可能是最好的解决方案,但让我们构建一个 UDF 来评估 k 是否是 rank
.
首先让我们创建我们的数据框:
from pyspark.sql.types import *
df_schema = StructType(
[StructField('id', StringType()),
StructField('rank', MapType(StringType(), IntegerType()))]
)
df = spark.createDataFrame([
["0981850006", {"a": 1}],
["0981850006", {"b": 2, "c": 3}],
], df_schema)
现在我们的 UDF:
def isKey(k,d):
return k in d.keys()
isKey_udf = lambda k: psf.udf(lambda d: isKey(k,d), BooleanType())
给出:
df.withColumn(
"is_key",
isKey_udf('a')(df.rank)
)
+----------+-------------------+------+
| id| rank|is_key|
+----------+-------------------+------+
|0981850006| Map(a -> 1)| true|
|0981850006|Map(b -> 2, c -> 3)| false|
+----------+-------------------+------+