pyspark:获取列表值的不同元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pyspark:获取列表值的不同元素相关的知识,希望对你有一定的参考价值。

我有此格式的rdd,

rdd = sc.parallelize([('A', [1, 2, 4, 1, 2, 5]), ('B', [2, 3, 2, 1, 5, 10]), ('C', [3, 2, 5, 10, 5, 2])])

但是我想像下面那样改变rdd,

newrdd = [('A', [1, 2, 4, 5]), ('B', [2, 3, 1, 5, 10], ('C', [3, 2, 5, 10])]

意思是,我必须获得价值的独特要素。 ReduceByKey()在这里没有帮助。

我该如何实现?

答案

自Spark 2.4起,您可以使用PySpark SQL函数array_distinct

df = rdd.toDF(("category", "values"))
df.withColumn("foo", array_distinct(col("values"))).show()
+--------+-------------------+----------------+
|category|             values|             foo|
+--------+-------------------+----------------+
|       A| [1, 2, 4, 1, 2, 5]|    [1, 2, 4, 5]|
|       B|[2, 3, 2, 1, 5, 10]|[2, 3, 1, 5, 10]|
|       C|[3, 2, 5, 10, 5, 2]|   [3, 2, 5, 10]|
+--------+-------------------+----------------+

它具有不将JVM对象转换为Python对象的优点,因此比任何Python UDF都更有效。但是,它是一个DataFrame函数,因此您必须将RDD转换为DataFrame。在大多数情况下也建议这样做。

另一答案

这是在Python中获得结果的直接方法。请注意,RDD是不可变的。

Setup Spark会话/上下文

from pyspark.sql import SparkSession
from pyspark import SparkContext

spark = SparkSession.builder \
            .master("local") \
            .appName("SO Solution") \
            .getOrCreate()

sc = spark.sparkContext

解决方案代码

rdd = sc.parallelize([('A', [1, 2, 4, 1, 2, 5]), ('B', [2, 3, 2, 1, 5, 10]), ('C', [3, 2, 5, 10, 5, 2])])

newrdd = rdd.map(lambda x : (x[0], list(set(x[1]))))

newrdd.collect()

输出

[('A', [1, 2, 4, 5]), ('B', [1, 2, 3, 5, 10]), ('C', [10, 2, 3, 5])]
另一答案

您可以将数组转换为设置以获取不同的值。这是-我对语法进行了一些更改以使用scala。

    val spark : SparkSession = SparkSession.builder
      .appName("Test")
      .master("local[2]")
      .getOrCreate()
    import spark.implicits._
    val df = spark.createDataset(List(("A", Array(1, 2, 4, 1, 2, 5)), ("B", Array(2, 3, 2, 1, 5, 10)), ("C", Array(3, 2, 5, 10, 5, 2))))
    df.show()

    val dfDistinct = df.map(r=> (r._1, r._2.toSet) )
    dfDistinct.show()
另一答案
old_rdd = [('A', [1, 2, 4, 1, 2, 5]), ('B', [2, 3, 2, 1, 5, 10]), ('C', [3, 2, 5, 10, 5, 2])]
new_rdd = [(letter, set(numbers)) for letter, numbers in old_rdd]

喜欢吗?

list(set(numbers)),如果您真的需要它们作为列表吗?

以上是关于pyspark:获取列表值的不同元素的主要内容,如果未能解决你的问题,请参考以下文章

pyspark:计算列表中不同元素的出现次数

获取 PySpark 列中列表列表中第一个元素的最大值

python, pyspark : 获取 pyspark 数据框列值的总和

将 Pyspark 数据框转换为具有实际值的列表

使用 Pyspark 解析 JSON 字符串以查找列表中每个值的出现情况

Pyspark/SQL 将具有列表值的列连接到另一个数据框列