Python 2.7 Spark DataFrame ArrayType或MapType用于检查列中的值
我有一个pyspark数据框,其中一列是ID列表。例如,我想获得其中包含某个ID的行数 A好的,与我相关的两种列类型是Python 2.7 Spark DataFrame ArrayType或MapType用于检查列中的值,python-2.7,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Python 2.7,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,我有一个pyspark数据框,其中一列是ID列表。例如,我想获得其中包含某个ID的行数 A好的,与我相关的两种列类型是ArrayType和MapType。我可以使用map类型,因为在map/dict中检查成员身份比在数组中检查成员身份更有效 但是,要使用映射,我需要使用自定义的udf而不是内置的(scala)函数array\u进行过滤 使用MapType我可以: from pyspark.sql.types import BooleanType from pyspark.sql.function
ArrayType
和MapType
。我可以使用map类型,因为在map/dict中检查成员身份比在数组中检查成员身份更有效
但是,要使用映射,我需要使用自定义的udf
而不是内置的(scala)函数array\u进行过滤
使用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()
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()
或者使用ArrayType
我可以:
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()
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\u包含执行scala代码,我假设调用任何scala定义的函数都比将列dict返回到python上下文并检查k in d.keys()
更有效
要检查此(多值)列中的成员资格,最好使用MapType
或ArrayType
pyspark.sql.types
更新
有一个column方法,这意味着我可以在不使用pythonudf的情况下按成员身份进行筛选。在我使用的Scala+Spark中,映射的性能更高
df.where(df("ids").getItem("123") === true)
它使用标准的Dataframe API和df(“ids”)。getItem(“123”)返回列,值为map或null,它将以Spark的本机速度工作。Pyspark开发人员说Pyspark也有这个API。首先,UDF
会降低性能。其次,我会选择ArrayType
,因为ID
可以具有特定ID的任意计数值。映射更为有效,在Scala+Spark中,我使用了df。其中(df(“ids”).getItem(“123”)==true),它使用标准数据帧API和df(“ids”)。getItem(“123”)返回带有映射值或null的列,我怀疑Pyspark也有类似的东西,所以会以sparks的原生速度。有@alexeipab thankshey@alexeipab thankshey agian给出了这个答案,如果你把它写出来,我会接受的