代码之家  ›  专栏  ›  技术社区  ›  Nevermore

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

  •  2
  • Nevermore  · 技术社区  · 7 年前

    两个与我相关的列类型是 ArrayType MapType . 我可以使用map类型,因为在map/dict中检查成员身份比在数组中检查成员身份更有效。

    但是,要使用地图,我需要使用自定义 udf 而不是内置的(scala)函数 array_contains

    地图类型 我能做到:

    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 因为在地图中检查成员身份(我假设)更有效。

    另一方面,内置函数 数组\u包含 执行 我假设无论调用什么scala定义的函数,都比将列dict返回到python上下文并进行检查更有效 k in d.keys() .

    pyspark.sql.types ?

    有一个列方法 pyspark.sql.Column.getItem 这意味着我可以在没有python的情况下通过成员身份进行过滤 自定义项

    1 回复  |  直到 7 年前
        1
  •  1
  •   alexeipab    7 年前

    df.where(df("ids").getItem("123") === true)
    

    它使用标准的DataFrameAPI和df(“ids”).getItem(“123”)返回

    推荐文章