PySpark,在列的字符串中保存唯一的字母

mbjcgjjk  于 2022-12-27  发布在  Apache
关注(0)|答案(2)|浏览(174)

我使用的是PySpark,我想用一种简单的方法来完成下一个过程,而不是过于复杂。
假设我有一个类似这样的表:
| 识别号|信件|
| - ------|- ------|
| 1个|a、B、c、d|
| 第二章|B、丁、乙|
| 三个|c、y、u|
我想从“字母”列中获取此 Dataframe 中的唯一字母,这将是:列表= [a,B,c,d,y,u]。
我试过使用in操作符,我不知道如何迭代每个寄存器,但我不想搞得一团糟,因为最初的计划是针对大数据集。

5cg8jx4n

5cg8jx4n1#

你可以试试这样的方法:

import pyspark.sql.functions as F

data1 = [
    [1, "a,b,c,d"],
    [2, "b,d,b"],
    [3, "c,y,u"],
]

df = spark.createDataFrame(data1).toDF("ID", "Letters")

dfWithDistinctValues = df.select(
    F.array_distinct(
        F.flatten(F.collect_set(F.array_distinct(F.split(df.Letters, ","))))
    ).alias("unique_letters")
)

defaultValues = [
    data[0] for data in dfWithDistinctValues.select("unique_letters").collect()
]

print(defaultValues)

这里发生了什么:
1.首先,我使用F. split通过""拆分字符串,并使用F. array_distinct在行级别删除重复项
1.我使用collect_set将所有不同的数组放到一行中,在这个阶段,这是数组的数组,它看起来像这样:
[[b,d],[a,b,c,d],[c,y,u]
1.然后我使用flatten将所有值作为单独的字符串:
[b、d、a、b、c、d、c、y、u]
1.仍然有一些重复项会被array_distinct删除,因此最后的输出如下所示:
[b、d、a、c、y、u]

jk9hmnmh

jk9hmnmh2#

根据数据集和数组的大小(如果它们非常大,这可能不是您想要的路径),您可以使用explode函数轻松获得所需的内容:

from pyspark.sql.functions import explode

df = spark.createDataFrame(
    [
        (1, ["a", "b", "c", "d"]),
        (2, ["b", "d", "b"]),
        (3, ["c", "y", "u"])
    ],
    ["ID", "Letters"]
)

# Creating a dataframe with 1 column, "letters", with distinct values per row
uniqueLettersDf = df.select(explode("Letters").alias("letters")).distinct()

# Using list comprehension and the .collect() method to turn our dataframe into a Python list
output = [row['letters'] for row in uniqueLettersDf.collect()]

output
['d', 'c', 'b', 'a', 'y', 'u']

相关问题