从PySpark DataFrame整数列表中快速检索唯一整数?

时间:2017-07-10 23:11:35

标签: pyspark

假设您有一个Pyspark DataFrame,df

DataFrame[set_sid_index: array<int>]

看起来像:

+--------------------+
|       set_sid_index|
+--------------------+
|           [8, 0, 1]|
|              [8, 1]|
|                 [9]|
|                 [0]|
|                 [2]|
|           [0, 1, 3]|
|           [8, 0, 1]|
|[22, 2, 6, 0, 1, 21]|
|  [2, 0, 1, 4, 5, 3]|
|              [0, 1]|
|           [0, 1, 3]|
|              [0, 1]|
|                 [9]|
|      [2, 105, 4, 3]|
+--------------------+

和另一个PySpark DataFrame,df2

DataFrame[set_sid_index: array<int>]

+--------------------+
|       set_sid_index|
+--------------------+
|           [8, 0, 1]|
+--------------------+

如何转换df数组中列表的元素,以便转换任何不是{0, 1, 8}的元素(df2的唯一元素)到&#34; 0&#34;或者&#34; 1&#34;或者&#34; 8&#34;?

---上段的澄清---

对于我的特定用例,我必须找到uniq,它将是整数列表数组中的唯一元素集。具体来说,在我上面给出的示例中,df2只有一个列表具有唯一值(0,1,8)。实际上,df2会有多个重叠值列表。我需要uniq = unique(df2values)。我该怎么做?

1 个答案:

答案 0 :(得分:1)

我对你的&#34;转换为0,或1,或8&#34;有点困惑;所以,让我们更精确:

  

如果1-st df的元素不在数组[0,1,8]中,我们将其转换为0

鉴于这种资格,让我们开始。

我们有:

from pyspark.sql.functions import udf
from pyspark.sql.types import *
uniq = [8, 0, 1]
sdf.show()
+--------------------+
|       set_sid_index|
+--------------------+
|           [8, 0, 1]|
|              [8, 1]|
|                 [9]|
|                 [0]|
|                 [2]|
|           [0, 1, 3]|
|           [8, 0, 1]|
|[22, 2, 6, 0, 1, 21]|
|  [2, 0, 1, 4, 5, 3]|
|              [0, 1]|
|           [0, 1, 3]|
|              [0, 1]|
|                 [9]|
|      [2, 105, 4, 3]|
+--------------------+


sdf.printSchema()
root
 |-- set_sid_index: array (nullable = true)
 |    |-- element: long (containsNull = true)

现在让我们定义一个简单的udf并应用它:

convertToZero = udf(lambda x: [0 if i not in uniq else i for i in x], ArrayType(IntegerType()))
sdf.withColumn('set_sid_index', convertToZero(sdf['set_sid_index'])).show(truncate=False)
+------------------+
|set_sid_index     |
+------------------+
|[8, 0, 1]         |
|[8, 1]            |
|[0]               |
|[0]               |
|[0]               |
|[0, 1, 0]         |
|[8, 0, 1]         |
|[0, 0, 0, 0, 1, 0]|
|[0, 0, 1, 0, 0, 0]|
|[0, 1]            |
|[0, 1, 0]         |
|[0, 1]            |
|[0]               |
|[0, 0, 0, 0]      |
+------------------+

<强>更新

假设您没有现成的uniq数组。

然后:

sdf2.show()
+--------------------+
|       set_sid_index|
+--------------------+
|[22, 2, 6, 0, 1, 21]|
|  [2, 0, 1, 4, 5, 3]|
|              [0, 1]|
+--------------------+

x = sdf2.withColumn('set_sid_index', explode(sdf2['set_sid_index'])).drop_duplicates().collect()
uniq = [i[0] for i in x]
uniq
[0, 22, 6, 5, 1, 3, 2, 4, 21]