假设您有一个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)
。我该怎么做?
答案 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]