Dataframe 用于过滤PySpark中的值的函数

Dataframe 用于过滤PySpark中的值的函数,dataframe,apache-spark,filter,pyspark,Dataframe,Apache Spark,Filter,Pyspark,我试图在PySpark中运行一个for循环,该循环需要一个过滤器来过滤算法中的变量 下面是我的数据帧df_产品的一个示例: +----------+--------------------+--------------------+ |ID | NAME | TYPE | +----------+--------------------+--------------------+ | 7983 |SNEAKERS 01

我试图在PySpark中运行一个for循环,该循环需要一个过滤器来过滤算法中的变量

下面是我的数据帧df_产品的一个示例:

+----------+--------------------+--------------------+
|ID        |        NAME        |           TYPE     |
+----------+--------------------+--------------------+
|    7983  |SNEAKERS 01         |            Sneakers|
|    7034  |SHIRT 13            |               Shirt|
|    3360  |SHORTS 15           |               Short|
我想迭代一个ID列表,从算法中获取匹配项,然后过滤产品的类型

我创建了一个函数来获取以下类型:

def get_type(ID_PROD):
    return [row[0] for row in df_prods.filter(df_prods.ID == ID_PROD).select("TYPE").collect()]
希望它能回来:

print(get_type(7983))
Sneakers
但我发现了两个问题:
1-这样做需要很长时间(比我在Python上做类似的事情要长)
2-它返回字符串数组类型:['Sneakers'],当我尝试过滤产品时,会发生以下情况:

type = get_type(7983)
df_prods.filter(df_prods.type == type)
java.lang.RuntimeException: Unsupported literal type class java.util.ArrayList [Sneakers]
有人知道在PySpark上实现这一点的更好方法吗


事先非常感谢。我学习PySpark非常困难。

对您的功能进行一些调整。这将从筛选后找到的第一条记录返回目标列的实际字符串

from pyspark.sql.functions import col

def get_type(ID_PROD):
  return df.filter(col("ID") == ID_PROD).select("TYPE").collect()[0]["TYPE"]

type = get_type(7983)
df_prods.filter(col("TYPE") == type) # works
我发现使用
col(“colname”)
更具可读性


关于您提到的性能问题,如果没有更多细节(例如,检查数据和应用程序的其余部分),我真的不能不说。尝试此语法,并告诉我性能是否有所提高。

只需收集即可。。一定要收集。它成功了,谢谢!过滤需要9秒,这比我和熊猫相处的时间要长。我知道我必须在熊猫的内存中使用数据帧,而不是在Pyspark中,但我缺乏Pyspark的知识来加快它。