用于检查列中值的 Spark DataFrame ArrayType 或 MapType
Spark DataFrame ArrayType or MapType for checking for value in column
我有一个 pyspark 数据框,其中一列是 ID 列表。例如,我想获取其中具有特定 ID 的行数。
据我所知,与我相关的两种列类型是 ArrayType
和 MapType
。我可以使用 map 类型,因为检查 map/dict 中的成员资格比检查数组中的成员资格更有效。
但是,要使用地图,我需要使用自定义 udf
而不是内置 (scala) 函数 array_contains
进行过滤
有了 MapType
我可以做到 :
from pyspark.sql.types import BooleanType
from pyspark.sql.functions import udf
df = spark.createDataFrame([("a-key", {"345": True, "123": True})], ["key", "ids"])
def is_in_map(k, d):
return k in d.keys()
def map_udf(key):
return udf(lambda d: is_in_map(key, d), BooleanType())
c = df.filter(map_udf("123")(df.ids)).count()
或者 ArrayType
我可以做到 :
from pyspark.sql.functions import array_contains
df = spark.createDataFrame([("a-key", ["345", "123"])], ["key", "ids"])
c = df.filter(array_contains(df.ids, "123")).count()
我的第一反应是使用 MapArray
因为检查地图内部的成员资格(我认为)更有效。
另一方面,内置函数 array_contains
执行 scala 代码,我假设我调用的任何 scala 定义的函数都比返回列字典到 python 上下文并检查 k in d.keys()
.
要检查此(多值)列中的成员资格,最好使用 MapType
还是 ArrayType
pyspark.sql.types
?
更新
有一个列方法 pyspark.sql.Column.getItem
这意味着我可以在没有 python udf
的情况下按成员资格进行过滤
地图的性能更高,我使用的是 Scala + Spark
df.where(df("ids").getItem("123") === true)
它使用标准 Dataframe API 和 df("ids").getItem("123") returns Column 的值为map 或 null,它将以 Spark 的本机速度运行。 Pyspark 开发人员说 Pyspark 也有 API。
我有一个 pyspark 数据框,其中一列是 ID 列表。例如,我想获取其中具有特定 ID 的行数。
据我所知,与我相关的两种列类型是 ArrayType
和 MapType
。我可以使用 map 类型,因为检查 map/dict 中的成员资格比检查数组中的成员资格更有效。
但是,要使用地图,我需要使用自定义 udf
而不是内置 (scala) 函数 array_contains
有了 MapType
我可以做到 :
from pyspark.sql.types import BooleanType
from pyspark.sql.functions import udf
df = spark.createDataFrame([("a-key", {"345": True, "123": True})], ["key", "ids"])
def is_in_map(k, d):
return k in d.keys()
def map_udf(key):
return udf(lambda d: is_in_map(key, d), BooleanType())
c = df.filter(map_udf("123")(df.ids)).count()
或者 ArrayType
我可以做到 :
from pyspark.sql.functions import array_contains
df = spark.createDataFrame([("a-key", ["345", "123"])], ["key", "ids"])
c = df.filter(array_contains(df.ids, "123")).count()
我的第一反应是使用 MapArray
因为检查地图内部的成员资格(我认为)更有效。
另一方面,内置函数 array_contains
执行 scala 代码,我假设我调用的任何 scala 定义的函数都比返回列字典到 python 上下文并检查 k in d.keys()
.
要检查此(多值)列中的成员资格,最好使用 MapType
还是 ArrayType
pyspark.sql.types
?
更新
有一个列方法 pyspark.sql.Column.getItem
这意味着我可以在没有 python udf
地图的性能更高,我使用的是 Scala + Spark
df.where(df("ids").getItem("123") === true)
它使用标准 Dataframe API 和 df("ids").getItem("123") returns Column 的值为map 或 null,它将以 Spark 的本机速度运行。 Pyspark 开发人员说 Pyspark 也有 API。