我有一个稀疏填充的表,其中包含唯一用户ids的各个段的值。我只需要创建一个包含unique_id和相关段标头的数组
请注意,这只是一个指示性的数据集。我有几百个这样的片段。
------------------------------------------------
| user_id | seg1 | seg2 | seg3 | seg4 | seg5 |
------------------------------------------------
| 100 | M | null| 25 | null| 30 |
| 200 | null| null| 43 | null| 250 |
| 300 | F | 3000| null| 74 | null|
------------------------------------------------我希望输出结果是
-------------------------------
| user_id| segment_array |
-------------------------------
| 100 | [seg1, seg3, seg5] |
| 200 | [seg3, seg5] |
| 300 | [seg1, seg2, seg4] |
-------------------------------在pyspark-sql的pyspark中有什么函数可以实现这一点吗?
谢谢你的帮忙!
发布于 2020-09-02 19:11:13
我找不到直接的方法,但你可以这样做。
cols= df.columns[1:]
r = df.withColumn('array', array(*[when(col(c).isNotNull(), lit(c)).otherwise('notmatch') for c in cols])) \
.withColumn('array', array_remove('array', 'notmatch'))
r.show()
+-------+----+----+----+----+----+------------------+
|user_id|seg1|seg2|seg3|seg4|seg5| array|
+-------+----+----+----+----+----+------------------+
| 100| M|null| 25|null| 30|[seg1, seg3, seg5]|
| 200|null|null| 43|null| 250| [seg3, seg5]|
| 300| F|3000|null| 74|null|[seg1, seg2, seg4]|
+-------+----+----+----+----+----+------------------+发布于 2020-09-02 17:18:40
我不确定这是不是最好的方法,但我会这样攻击它:
有一个collect_set函数,它将在您聚合的一系列值中始终为您提供唯一的值。
对以下各项上的每个线段进行并集:
df_seg_1 = df.select(
'user_id',
fn.when(
col('seg1').isNotNull(),
lit('seg1)
).alias('segment')
)
# repeat for all segments
df = df_seg_1.union(df_seg_2).union(...)
df.groupBy('user_id').agg(collect_list('segment'))https://stackoverflow.com/questions/63702173
复制相似问题