Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Spark DataFrame ArrayType或MapType用于检查列中的值_Python 2.7_Apache Spark_Pyspark_Apache Spark Sql_Pyspark Sql - Fatal编程技术网

Python 2.7 Spark DataFrame ArrayType或MapType用于检查列中的值

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

我有一个pyspark数据框,其中一列是ID列表。例如,我想获得其中包含某个ID的行数

A好的,与我相关的两种列类型是
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方法,这意味着我可以在不使用python
udf的情况下按成员身份进行筛选。在我使用的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给出了这个答案,如果你把它写出来,我会接受的