两个与我相关的列类型是
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的情况下通过成员身份进行过滤
自定义项