Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 PySpark-将单个整数列表与列表列进行比较_Python_Apache Spark_Pyspark - Fatal编程技术网

Python PySpark-将单个整数列表与列表列进行比较

Python PySpark-将单个整数列表与列表列进行比较,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我试图检查spark数据框(包含列表的列)中的哪些条目包含给定列表中数量最大的值 我想到的最佳方法是使用rdd.foreach()迭代数据帧,并使用python的set1.intersection(set2)将给定列表与每个条目进行比较 我的问题是spark是否有任何内置功能,因此可以避免使用进行迭代 谢谢你的帮助 另外,我的数据框如下所示: +-------------+---------------------+

我试图检查spark数据框(包含列表的列)中的哪些条目包含给定列表中数量最大的值

我想到的最佳方法是使用
rdd.foreach()
迭代数据帧,并使用python的
set1.intersection(set2)
将给定列表与每个条目进行比较

我的问题是spark是否有任何内置功能,因此可以避免使用
进行迭代

谢谢你的帮助

另外,我的数据框如下所示:

+-------------+---------------------+                                           
|   cardnumber|collect_list(article)|
+-------------+---------------------+
|2310000000855| [12480, 49627, 80...|
|2310000008455| [35531, 22564, 15...|
|2310000011462| [117112, 156087, ...|
+-------------+---------------------+
df_long = spark.createDataFrame([
    (1, 3),(1, 4), (1, 8), (2, 7), (2, 7), (2, 6)
], ("id", "articles"))

我试图在第二列中找到与给定文章列表最相交的条目,例如
[151574、87239、117908、162475、48599]

您可以在dataframe中尝试相同的集合操作,而不是使用rdd。foreach:

from pyspark.sql.functions import udf, li, col
my_udf=udf(lambda A,B: list(set(A).intersection(set(B))))
df=df.withColumn('intersect_value', my_udf('A', 'B'))

您可以使用len函数获取UDF本身中的intersect list的大小,并从该数据帧执行所需的操作。

这里唯一的替代方法是
UDF
,但它不会有太大区别

from pyspark.sql.functions import udf, li, col

def intersect(xs):
    xs = set(xs)
    @udf("array<long>")
    def _(ys):
        return list(xs.intersection(ys))
    return _
根据名称,您似乎使用了
collect\u list
,因此您的数据可能如下所示:

+-------------+---------------------+                                           
|   cardnumber|collect_list(article)|
+-------------+---------------------+
|2310000000855| [12480, 49627, 80...|
|2310000008455| [35531, 22564, 15...|
|2310000011462| [117112, 156087, ...|
+-------------+---------------------+
df_long = spark.createDataFrame([
    (1, 3),(1, 4), (1, 8), (2, 7), (2, 7), (2, 6)
], ("id", "articles"))
在这种情况下,问题更简单。加入

lookup = spark.createDataFrame(a_list, "long").toDF("articles")

joined = lookup.join(df_long, ["articles"])
并汇总结果:

joined.groupBy("id").count().show()
# +---+-----+                                                                     
# | id|count|
# +---+-----+
# |  1|    1|
# |  2|    1|
# +---+-----+


joined.groupBy("id").agg(collect_list("articles")).show()
# +---+----------------------+                                                    
# | id|collect_list(articles)|
# +---+----------------------+
# |  1|                   [4]|
# |  2|                   [6]|
# +---+----------------------+

我得到了错误:NameError:name'udf'未定义您是否使用了此导入->从pyspark.sql.functions导入udf,li,col也许您应该将其放入您的答案中,尽管已在答案中添加。谢谢